RaspberryPi : utilisation d’Open2300 pour les stations météo La Crosse Technology

J’ai fait acquisition (enfin, le père Noël m’a gentiment apporté) un Raspberry Pi avec une station météo La Crosse Technology WS2355. Cette station a la particularité d’être connectable à un ordinateur par RS232, l’idée d’utiliser le Raspberry Pi pour conserver un historique des données s’est donc faite naturellement. La station est livrée avec un adaptateur RS232 vers USB Prolific PL2303. Mes premières lectures sur le net semblaient indiquer que cet adaptateur ne fonctionne pas avec le Raspberry Pi, mais après avoir essayé, tout semble fonctionner avec ce dernier. Voici donc la procédure pour installer tout ce beau monde sur le RPi avec la bibliothèque open2300, dédiée à l’accès aux données des stations météo de la gamme WS23xx. L’enregistrement des données se fera dans une base de données MySQL.

Je suppose dans ce tuto que vous avez un serveur MySQL fonctionnel. Pour ma part, j’ai un serveur LNMP sur mon Raspberry (Linux, Nginx, MySQL, PHP), avec PhpMyAdmin d’installé, ce qui va faciliter les choses. Pour ma part, je me connecte sur le Raspberry Pi avec SSH, ce qui permet entre autre le copié-collé de commandes.

Le système connecté sur le RPi

Le système connecté sur le RPi

Téléchargement, compilation et configuration basique de open2300

Première étape, télécharger open2300, le décompresser, puis aller dans le répertoire des sources, ce qui peut se faire en ligne de commande avec :

wget http://heanet.dl.sourceforge.net/project/open2300/open2300/1.10/open2300-1.10.zip
unzip open2300-1.10.zip
cd open2300-1.10

On va compiler open2300, ceci se fait de façon automatique avec la commande make. Cependant, mysql2300, qui permet d’enregistrer les données dans la base de données, se compile séparément. Pour compiler les 2, il faut donc faire :

make
make mysql2300

Il est possible que l’on vous dise après la commande make mysql2300 que le fichier mysql.h n’a pas été trouvé. Il faut donc installer la bonne bibliothèque puis relancer la compilation de mysql2300 :

sudo apt-get install libmysqld-dev
make mysql2300

Branchez ensuite l’adaptateur sur le Raspberry Pi et la station à l’adaptateur.Sur le Raspberry Pi, tapez la commande

lsusb

Vous devriez voir l’adaptateur apparaître s’il est bien reconnu :

Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

Vérifiez sous quel nom apparaît l’adaptateur dans le système, avec la commande :

sudo ls -l /dev/tty* | grep dialout

L’adaptateur doit apparaître sous le nom ttyUSBx (ou éventuellement ttySx mais ça serait plus étonnant)  :

crw-rw---T 1 root dialout 5, 3 janv. 1 1970 /dev/ttyprintk
crwxrwxrwt 1 root dialout 188, 0 janv. 13 14:05 /dev/ttyUSB0

Notez sous quel nom il apparaît (en principe ttyUSB0 donc). Il va falloir configurer ensuite open2300. Créez le fichier de configuration en utilisant le fichier open2300-dist.conf comme modèle :

cp open2300-dist.conf open2300.conf

Il faut ensuite éditer ce fichier afin d’indiquer sur quel port la station se trouve. Tapez :

nano open2300.conf

Trouvez la ligne SERIAL_DEVICE et remplacez /dev/ttySO présente par défaut par /dev/ttyUSB0. A ce moment, il est en principe possible de récupérer les données. Pour cela, on va utiliser fetch2300. Toujours dans le répertoire open2300-1.10, tapez :

sudo ./fetch2300

Il est très probable que vous obteniez une erreur « Could not reset », c’est du a une erreur de droit sur l’adaptateur série. Il faut donner tous les droits avec la commande :

sudo chmod a+rwx /dev/ttyUSB0

Vous devriez maintenant obtenir quelque chose du type en réponse à la commande fetch2300 :

pi@raspberrypi ~/open2300-1.10 $ sudo fetch2300
Date 2013-Jan-14
Time 15:45:19
Ti 19.6
Timin 14.4
Timax 20.8
TTimin 12:22
DTimin 2013-01-10
TTimax 15:48
DTimax 2013-01-12
To 81.1
Tomin 81.1
Tomax 81.1
TTomin 00:10
DTomin 2000-00-00
TTomax 00:10
DTomax 2000-00-00
DP 81.1
DPmin 81.1
DPmax 81.1
TDPmin 00:10
DDPmin 2000-00-00
TDPmax 00:10
DDPmax 2000-00-00
RHi 58
RHimin 53
RHimax 68
TRHimin 23:21
DRHimin 2013-01-13
TRHimax 11:41
DRHimax 2013-01-14
RHo 110
RHomin 110
RHomax 110
TRHomin 00:10
DRHomin 2000-00-00
TRHomax 00:10
DRHomax 2000-00-00
WS 51.0
DIRtext N
DIR0 0.0
DIR1 0.0
DIR2 0.0
DIR3 0.0
DIR4 0.0
DIR5 0.0
WC 81.1
WCmin 81.1
WCmax 81.1
TWCmin 00:10
DWCmin 2000-00-00
TWCmax 00:10
DWCmax 2000-00-00
WSmin 0.0
WSmax 0.0
TWSmin 00:00
DWSmin 2001-01-01
TWSmax 00:00
DWSmax 2001-01-01
R1h 0.00
R1hmax 0.00
TR1hmax 15:44
DR1hmax 2013-01-14
R24h 0.00
R24hmax 0.00
TR24hmax 15:00
DR24hmax 2013-01-14
Rtot 0.00
TRtot 17:42
DRtot 2001-01-01
RP 977.100
RPmin 975.100
RPmax 992.500
TRPmin 04:40
DRPmin 2013-01-11
TRPmax 00:00
DRPmax 2001-01-01
Tendency Falling
Forecast Rainy

A noter les valeurs qui semblent étranges chez moi, c’est parce que je n’ai pas encore branché les capteurs extérieurs, on a donc les valeurs par défaut. Cela provoque également une grande lenteur de la récupération des données (enfin, je pense que cela vient de la), chez moi, tous les programmes proposés par open2300 mettent donc environ 4 minutes à retourner leurs données.

Le logo du Raspberry Pi

Le logo du Raspberry Pi

Sauvegarde des données dans MySQL

Nous allons ensuite mettre en place l’historique des données dans MySQL. Il est nécessaire avant de lancer mysql2300 (utilitaire qui lit les données de la station et les enregistre dans MySQL) de créer la base de données et de créer l’utilisateur open2300. La création de la base de données se fait en utilisant le fichier mysql2300.sql. Depuis la sortie de open2300, la syntaxe MySQL a été modifiée. Dans le fichier SQL, la requête de création est la suivante :

CREATE TABLE `weather` (
`timestamp` BIGINT(14) NOT NULL DEFAULT '0',
`rec_date` DATE NOT NULL DEFAULT '0000-00-00',
`rec_time` TIME NOT NULL DEFAULT '00:00:00',
`temp_in` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`temp_out` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`dewpoint` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`rel_hum_in` tinyint(3) NOT NULL DEFAULT '0',
`rel_hum_out` tinyint(3) NOT NULL DEFAULT '0',
`windspeed` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`wind_angle` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`wind_direction` CHAR(3) NOT NULL DEFAULT '',
`wind_chill` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`rain_1h` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`rain_24h` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`rain_total` DECIMAL(4,1) NOT NULL DEFAULT '0.0',
`rel_pressure` DECIMAL(4,1) NOT NULL DEFAULT '0.0',
`tendency` VARCHAR(7) NOT NULL DEFAULT '',
`forecast` VARCHAR(6) NOT NULL DEFAULT '',
UNIQUE KEY `timestamp` (`timestamp`)
) TYPE=MyISAM;

Cette requête fait donc une erreur lorsqu’on l’exécute dans MySQL :

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM' at line 21

Il faut donc remplacer TYPE=MyISAM par ENGINE = MyISAM

CREATE TABLE `weather` (
`timestamp` BIGINT(14) NOT NULL DEFAULT '0',
`rec_date` DATE NOT NULL DEFAULT '0000-00-00',
`rec_time` TIME NOT NULL DEFAULT '00:00:00',
`temp_in` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`temp_out` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`dewpoint` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`rel_hum_in` tinyint(3) NOT NULL DEFAULT '0',
`rel_hum_out` tinyint(3) NOT NULL DEFAULT '0',
`windspeed` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`wind_angle` DECIMAL(4,1) NOT NULL DEFAULT '0.0',
`wind_direction` CHAR(3) NOT NULL DEFAULT '',
`wind_chill` DECIMAL(3,1) NOT NULL DEFAULT '0.0',
`rain_1h` DECIMAL(5,1) NOT NULL DEFAULT '0.0',
`rain_24h` DECIMAL(5,1) NOT NULL DEFAULT '0.0',
`rain_total` DECIMAL(7,1) NOT NULL DEFAULT '0.0',
`rel_pressure` DECIMAL(5,1) NOT NULL DEFAULT '0.0',
`tendency` VARCHAR(7) NOT NULL DEFAULT '',
`forecast` VARCHAR(6) NOT NULL DEFAULT '',
UNIQUE KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM;

A noter également le rel_pressure qui passe de decimal(4,1) à decimal (5,1), car sinon, on ne peut enregistrer la pression que jusqu’à 999,9 hPa, alors qu’on dépasse fréquemment cette pression (merci à Lecerf qui me l’a signalé dans les commentaires. Il signal aussi de son côté qu’il a passé wind_angle à decimal(4,1)). Pour ma part, j’ai aussi passé le rain_1h, rain_24h à 5,1 (au lieu de 3,1, ce qui limite à 99,9 mm de pluie sur 1 ou 24h), et le rain_total à 7,1 (sinon ça  limite le total à 999,9 mm, chiffre qu’on atteint assez rapidement à peu près partout en France).

Personnellement, j’ai exécuté cette requête directement dans MySQL. Profitez en pour créer l’utilisateur open2300 qui as les droits sur cette base. Le mot de passe par défaut est mysql2300. Soit vous utilisez ces mots de passes et login, soit vous les personalisez, auquel cas il faut indiquer ces paramètres dans le fichier open2300.conf dans la section « >### MYSQL Settings (only used by mysql2300) ».

Lancez la commande mysql2300 en tapant dans le repertoir ou nous avons compilé open2300:

sudo ./mysql2300

Quelques minutes plus tard, les données doivent apparaître dans la base de données si tout est bien configuré. S’il n’y a pas d’erreur, rien n’est retourné par le programme.

Installation de open2300 dans le système

Il faut ensuite installer les différents exécutables dans le système. Cela peut se faire grâce aux commandes suivantes :

sudo make install
sudo cp mysql2300 /usr/local/bin/mysql2300
sudo cp open2300.conf /usr/local/etc/open2300.conf

Les 2 dernières lignes sont nécessaires car mysql2300 n’est pas copié automatiquement par la commande make install et que le fichier de configuration n’est pas non plus copié.

Désormais, on doit pouvoir appeler les différents exécutables de de la suite open2300 depuis n’importe quel dossier du système.

Automatisation de la capture des données

Enfin, il faut mettre en place l’automatisation de la capture des données. Cela se fait avec cron notamment.

Tout d’abord, il est nécessaire de remettre à chaque démarrage les bons droits sur le convertisseur USB vers série car ces droits ne sont pas sauvegarder à l’arrêt. Pour cela, il faut éditer le fichier /etc/rc.local :

sudo nano /etc/rc.local

Rajouter tout en bas du fichier, juste avant exit : sudo chmod a+rwx /dev/ttyUSB0, puis quitter en sauvegardant.

Enfin, il faut automatiser le lancement du programme mysql2300, on le fait avec cron. Editer avec nano le fichier des Cron Tables :

sudo nano /etc/crontab

Ajouter tout en bas du fichier :

*/10 * * * *    pi sudo mysql2300 /usr/local/etc/open2300.conf

Cela provoquera l’appel toutes les 10 minutes du programme mysql2300 sous l’utilisateur pi (il faut changer le nom d’utilisateur si comme moi vous utilisez un autre nom d’utilisateur). Par ailleurs, j’ai rajouté « /usr/local/etc/open2300.conf » après mysql2300 car chez moi, les programmes de la suite open2300 ne parviennent pas à trouver où se situe le fichier de config. Cet argument permet d’indiquer à mysql2300 ou le fichier de configuration se trouve. Enfin, si vous souhaitez changer la périodicité de l’enregistrement des données, il suffit de changer le /10 en /x ou x est le nombre de minutes entre chaque mise à jour.

Pour information, chaque enregistrement prend au maximum 86 octets en base de données. Sur cette base, on a donc les quantités de données produites suivantes en fonction de l’intervalle de temps  :

Périodicité Nombre/h Taille/heure Taille/jour Taille/an
1  min 60 5,04  ko 120,94  ko 43,11  Mo
2  min 30 2,52  ko 60,47  ko 21,55  Mo
5  min 12 1,01  ko 24,19  ko 8,62  Mo
10  min 6 0,50  ko 12,09  ko 4,31  Mo
15  min 4 0,34  ko 8,06  ko 2,87  Mo
20  min 3 0,25  ko 6,05  ko 2,16  Mo
30  min 2 0,17  ko 4,03  ko 1,44  Mo
60  min 1 0,08  ko 2,02  ko 0,72  Mo

 Mise à jour du 10 mars 2013

Je complète cet article après quelques semaines de fonctionnement et suite aux nombreux commentaires laissés par les lecteurs (merci à eux).

Script de lancement

J’ai constaté à plusieurs reprises que l’exécutable « mysql2300 » plantait de façon aléatoire pour une raison indéterminée. La conséquence était que la mise à jour dans la base de données ne se faisait que toutes les 10 minutes au lieu de 5 (une fois sur 2), j’imagine que si je laissais les choses telles quelles, il arriverait un moment ou je n’aurait plus aucune mise à jour. La solution pour que tout rendre dans l’odre ? Tuer le processus « zombifié ». J’ai donc créé un script qui fait ceci, placé chez moi dans /usr/local/etc/open2300.sh :

kill `egrep mysql2300`
mysql2300 /usr/local/etc/open2300.conf

Cela tue le processus mysql2300 (s’il existe encore…) avant de lancer une nouvelle instance.

Il faut modifier en conséquence le crontab, afin de ne plus appeler directement mysql2300 mais le script, sans oublier de supprimer l’appel direct à mysql2300 que nous avions mis précédemment :

*/10 * * * *    pi sudo /usr/local/etc/open2300.sh

Pour que le script puisse s’exécuter, il faut bien sur donner les droits d’exécution avec un petit chmod :

sudo chmod u+x /usr/local/etc/open2300.sh

Se connecter sur le réseau Weather Underground

J’ai ensuite voulu collaborer au site Weather Underground. Un logiciel de la suite open2300, wu2300 permet en théorie de le faire (voir dans les commentaires, il semble que ce soft soit boguée, une solution a été proposée par Thibault). Cependant, cette solution nécessite d’accéder à la station. Le problème est que je fait un relevé toutes les 5 minutes et qu’un relevé prend entre 3 et 4 minutes (je ne sais pas si cette lenteur est normale). Bref, si j’utilisent wu2300, je vais avoir un soucis…

Comme les données sont déjà en base de données, j’ai eu l’idée de ré-exploiter ces données. Je ne suis pas le premier à avoir voulu le faire, voici donc une version du script qui fonctionnera avec l’installation proposée dans ce billet d’open2300 :

#!/bin/bash

date=$(date '+%s')
data=$(mysql -s -u open2300 -pMotDePasseDBOpen2300 -D open2300 << !
SELECT timestamp, rec_date, rec_time, ROUND((temp_out * 9 / 5 + 32), 2) AS temp_outf,
ROUND((dewpoint * 9 / 5 + 32), 2) AS dewpointf, rel_hum_out,
ROUND(windspeed * 2.23693629, 2) AS windspeedmph,
wind_angle,
ROUND(rain_1h / 25.4, 2) AS rain_1hin, ROUND(rain_24h / 25.4, 2) AS rain_24hin,
ROUND(rel_pressure / 33.8638864, 3) AS rel_pressurein
FROM weather ORDER BY timestamp DESC LIMIT 1 ;
!
)
if [ $? -ne 0 ]
then
echo "Erreur accés base MySql meteo !"
exit 1
fi

liste="timestampws rec_date rec_time temp_outf dewpointf rel_hum_out windspeedmph wind_angle rain_1hin rain_24hin rel_pressurein"
echo $data | while read $liste
do
datews=`echo $timestampws | cut -c1-8`
heuresws=`echo $timestampws | cut -c9-10`
minutesws=`echo $timestampws | cut -c11-12`
secondesws=`echo $timestampws | cut -c13-14`
secondesdata=`date +%s -d $datews`
timestamp=$(echo "$secondesdata + $heuresws*3600 + $minutesws*60 + $secondesws" | bc)
diffsecondes=$(( $date - $timestamp ))
#echo "Diff. sec. = $diffsecondes"
if [ $diffsecondes -gt 600 ]
then
echo "Donné Ws2300 plus à jour !"
exit 1
fi

BASEURL_wu="weatherstation.wunderground.com"
PATH_wu="/weatherstation/updateweatherstation.php"
ID_wu="IdStationWU"
PASSWORD_wu="motDePasseWU"
SOFTWARETYPE_wu="open2300%20v1.10"
date_wu=$(date -u "+dateutc=%Y-%m-%d+%H%%3A%M%%3A%S")
url_wu="http://$BASEURL_wu$PATH_wu?ID=$ID_wu&PASSWORD=$PASSWORD_wu&$date_wu&tempf=$temp_outf&dewptf=$dewpointf&humidity=$rel_hum_out&windspeedmph=$windspeedmph&winddir=$wind_angle&rainin=$rain_1hin&dailyrainin=$rain_24hin&baromin=$rel_pressurein&softwaretype=open2300%20v1.10m&action=updateraw"
#echo $url_wu
reponse_wu=$(wget -q -O - "$url_wu")
#echo $reponse_wu
if [ "$reponse_wu" != "success" ]
then
echo "$reponse_wu"
echo "Erreur mise à jour station WS2300 sur Weather UnderGround !"
fi
done

J’ai enregistré le script dans sudo chmod u+x /usr/local/etc/wu2300.sh, il fait bien sur le chmoder également pour le rendre exécutable.

Ensuite, je me content de l’appeler depuis le script open2300.sh, qui devient :

kill `egrep mysql2300`
mysql2300 /usr/local/etc/open2300.conf
/usr/local/etc/wu2300.sh

Il faudra bien sur créer au préalable un compte sur WU, et l’identifiant de la station sur cette page. C’est l’identifiant de la station qu’il faut déclarer comme identifiant (ID_wu) dans le script et non le login utilisé pour se connecter sur le site Weather Underground. Voici le résultat de ma station.

Sauvegarde de la base de données

Je souhaitais sauvegarder la base de données régulièrement. Une fois de plus, on fait un petit script + un cron et ça roule :

On créé un fichier save2300.sh puis on le chmod :

mysqldump -u open2300 open2300 -pMotDePasse --opt > /home/pi/saveDb/open2300dump`date "+%Y%m%d"`.sql

Et on place la règle dans le cron qui va bien.

01 00   * * *   pi sudo /usr/local/etc/save2300.sh

Tous les jours, à minuit 01, on aura une sauvegarde dans le répertoire saveDb un fichier daté de la date du jour de la sauvegarde.

Reste encore à faire pour réaliser une station pleinement exploitable, une solution pour afficher les données archivées. Pour ma part, je suis en train de bidouiller une solution à base de HighCharts, qui permet de faire des graphs très propres.

 

Mise à jour du 14 novembre 2015 :

Thierry a également eu des problèmes de blocages… il a pris le temps d’enquêter et à trouvé les causes et donc les solutions les plus efficaces… Je me permet donc de reproduire ici, directement dans le corps de l’article, ses 2 derniers commentaires
Commentaire du 9 octobre

Bonjour,

Je reviens avec un complément d’info:
Les blocages de liaisons ont été résolus de la façon suivante:
Par cron, je lance un job acq_meteo.sh qui contient ce qui suit:

#!/bin/bash
# Role: Programme maître de lancement des acquisitions:
# Tue le précédent processus s’il pas terminé.
# Lance le nouveau cycle d’acquisitions.
#
#
/usr/local/bin/clear_2300.sh
/usr/local/bin/acq_donn_w2300.sh

le job clear_2300.sh contient:

#!/bin/bash
# Role: Tuer le programme resté en mémoire avant de lancer le processus
# suivant.
#
ps aux | grep acq_donn_w2300.sh | awk{print $2}| xargs kill -9

Et le job acq_donn_w2300.sh est celui qui lance les acquisitions .

Pourquoi ce choix: acq_donn_w2300.sh quand il est lancé est le processus père des acquisitions. Si une des acquisitons reste bloquée, il reste en mémoire.

Quand cron lance l’acquisition suivante, avec clear_2300.sh on regarde d’abord si le processus père acq_donn_w2300.sh de l’acquisiton précédente est toujours présent en mémoire; si oui, on le tue ce qui a pour effet de tuer les processus fils. On peut alors lancer le processus d’acquisition suivant.

Par contre, j’ai toujours des problèmes de perturbations radio. J’envisage de déplacer les capteurs pour les rapprocher et ainsi disposer d’un signal plus fort.

Cordialement.

Et celui du 13 octobre

Bonjour,

Derniers constats et solutions:
Les pertes de liaisons ne sont finalement pas dues à des problèmes de propagation mais au cordon de liaison USB-RS232. Il semble que chez moi ce dernier s’est dégradé au point de tout bloquer.
Il faut quand chercher bien longtemps pour identifier qu’une liaison série avec l’ordinateur (Pi) est la cause du blocage des acquisitions!

Donc, en complément de ce qui est écrit ci-dessus, qui débloque le processus en mémoire du Pi, il s’agit de débloquer la liaison série.
Pour ce faire, j’ai choisi de continuer le processus décrit précédemment (post du 9 octobre 2015) et d’ajouter un script qui:
– Décharge le module pilote de la liaison USB série.
– Réinitialise le port USB concerné
– Recharge le module pilote de la liaison USB série.

La difficulté, c’est qu’il n’existe pas de commande en natif pour réinitialiser un port USB; il a fallu rechercher pour trouver quelque chose qui le fasse.
Finalement, j’ai trouvé un petit programme en C qui le fasse: usbreset.c dont le listing est ci-dessous:

/* usbreset — send a USB port reset to a USB device */
/* Programme de Alan Stern venant du site: */
/* https://marc.info/?l=linux-usb&m=121459435621262&w=2*/
/* ——————————————————————- */
/* Compilation: cc usbreset.c -o usbreset */
/* Utilisation: lsusb pour identifier le port a reinitialiser */
/* on obtient (par exemple): */
/* Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. */
/* Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub */
/* Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. */
/* Bus 001 Device 004: ID 7392:7811 Edimax Technology Co., Ltd EW-7811 */
/* Un 802.11n W$ */
/* Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 */
/* Serial Port */
/* Le port qui nous intéresse est celui concernant PL2303 Serial Port */
/* La commande sera: usbreset /dev/bus/usb/001/005 */

#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;
if (argc != 2) {
fprintf(stderr, « Usage: usbreset device-filename\n »);
return 1;
}
filename = argv[1];
fd = open(filename, O_WRONLY);
if (fd < 0) {
perror("Error opening output file");
return 1;
}
printf("Resetting USB device %s\n", filename);
rc = ioctl(fd, USBDEVFS_RESET, 0);
if (rc < 0) {
perror("Error in ioctl");
return 1;
}
printf("Reset successful\n");

close(fd);
return 0;
}

Une fois compilé, rendre exécutable le binaire (chmod +x usbreset) et le copier dans le répertoire /usr/local/bin
Ecrire ensuite dans /usr/local/bin le script: resetusbserial.sh

#/bin/sh
# Decharger le module usb de la liaison serie
modprobe -rf pl2303

# Reinitialisation de la liaison usb serie
# Pour connaitre quel port USB doit etre reinitialise, utiliser la
# commande lsub, reperer dans le retour de la commande la ligne
# contenant: PL2303 Serial Port et recuperer les valeurs Bus et
# Device pour lancer la commande:
# usbreset /dev/bus/usb/Bus/Device
/usr/local/bin/usbreset /dev/bus/usb/001/005
# Recharger le module
modprobe -a pl2303

Une fois écrit, le rendre exécutable.
Modifier le script acq_meteo.sh décrit dans le précédent message comme suit:

#!/bin/bash
# Role: Programme maitre de lancement des acquisitions:
# Tue le precedent processus s'il pas termine.
# Lance le nouveau cycle d'acquisitions.
# Reinitialiser la liaison serie
#
#
/usr/local/bin/clear_2300.sh
/usr/local/bin/acq_donn_w2300.sh
/usr/local/bin/resetusbserial.sh

Bon, maintenant avec tout ceci j’ai un système à nouveau opérationnel. Que de temps et d’essais pour en arriver là. C’est certainement la rançon d’utiliser du matériel « cheap », mais pour l’instant je dois m’en contenter.

J’espère que tout ceci pourra aider ceux qui voudrons tenter l’aventure.

67 Responses to RaspberryPi : utilisation d’Open2300 pour les stations météo La Crosse Technology

  1. teeboo says:

    Bel article très complet, merci !
    Vu que tu es allé au bout des choses, je pense que tu connais également le site Weather Wunderground, dont l’API est implémenté dans Open 2300 et qui permet d’avoir directement des graphiques au lieu de construire une application avec les données de ta base MySql.
    En tout cas, très beau travail.

  2. Clément says:

    Merci tenboo pour ton commentaire. Oui, j’ai regardé un peu WU, je compte bien m’y mettre également. Je n’ai pas encore fait la mise en place pratique car mes capteurs extérieurs ne sont pas encore installés (je déménage dans 1 semaine, donc pas intéressant de le faire maintenant), mais je compte bien apporter ma contribution au réseau WU !

  3. Opanis says:

    Merci pour cet article qui m’a bien aidé pour installer open2300 sur mon raspeberry pi même si cela ne marche pas encore comme je le veux. Pour WU2300 perso rien ne se passe. Bon continuation a toi et aux plaisirs de lire l’avancé de ton installation sur ton blog.

  4. Pingback: Transformer votre Raspberry-Pi en récepteur AirPlay ou Miracast - Geek Mag

  5. teebo says:

    Hello Clément,

    Je voulais te faire un petit feedback, de l’installation de ma station météo avec mon Raspberry, je n’ai eu aucun problème à accéder aux données de la station et à les enregistrer dans une base mysql. En fait je connaissais déjà un peu car avant le raspberry j’avais implémenté le même système avec un routeur sous OpenWRT.
    En revanche, dans mon ancienne installation, le service wu2300 pour envoyer mes données sur le site Weather Underground marchait très bien et je n’arrive pas à le refaire marcher avec le raspberry.
    Je n’ai pas encore eu beaucoup de temps pour bidouiller et essayer de debugger tout ca mais si jamais ça t’arrives et que tu trouves la solution je suis preneur !

    Bien cordialement

    Thibault

    • Clément says:

      Bonjour teebo,

      Je n’ai pas encore eu le temps de me plonger dans l’utilisation de WU2300… il semblerait que tu ne sois pas le seul à avoir des soucis de ce coté (cf le commentaire de Opanis). Je regarderais à l’occasion et j’éditerais le billet…

      Tiens moi au jus si tu avances de ton coté, ça m’intéresse !

  6. Thibault says:

    A quel commentaire de « Opanis » fais-tu référence ?

  7. Thibault says:

    J’ai trouvé la solution, en fait il y a un bug dans les sources qui sont sur le repository du projet. Si j’avais réussi à le faire fonctionner sur mon routeur, c’est parce que j’avais utilisé une version toute compilée qui avait due être corrigée.

    Pour la correction du bug, je te renvois là où j’ai trouvé :

    http://www.chassignet.fr/Meteo/Evette/station.htm

    Il faut en fait modifier 2 fichiers:

    linux2300.c
    //sprintf(buffer, « GET %snHTTP/1.0nn », urlline);
    sprintf(buffer, « GET %s HTTP/1.0rnUser-Agent: open2300/1.10-2rnAccept: */*rnHost: weatherstation.wunderground.comrnConnection: Keep-Alivernrn », urlline);
    wu2300.c
    //sprintf(urlline, « http://%s%s?ID=%s&PASSWORD=%s »,
    //WEATHER_UNDERGROUND_BASEURL,WEATHER_UNDERGROUND_PATH,
    //config.weather_underground_id,config.weather_underground_password);
    sprintf(urlline, « %s?ID=%s&PASSWORD=%s »,
    WEATHER_UNDERGROUND_PATH,
    config.weather_underground_id,config.weather_underground_password);

    Et ca mache ! => http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IRHNEPOL2

    A bientôt pour d’autres histoires de Raspberry !

  8. Opanis says:

    Bonjour,

    Je continue tout doucement ma découverte de l’installation de ma station météo sur mon raspeberry pi, j’ai mis de coté wu2300 n’arrivant à rien avec et je me suis lancé dans mysql2300 après avoir galéré sur l’installation du serveur.

    J’ai deux soucis :
    – impossible de faire fonctionner les cron alors que je mets comme toi
    – lorsque je lance mysql2300 j’ai la température int à 9.9 et la pression à 999 alors qu’avec les autres modules fetch2300 et log2300 cela fonctionne.

    Avez-vous les mêmes soucis que moi ?

    Merci d’avance de votre réponse

    • Clément says:

      Bonjour Opanis.

      Pour WU2300, regarde le commentaire de Thibault juste au dessus, il propose une solution pour faire fonctionner le tout (pas eu le temps de la tester encore pour ma part).
      Pour le cron, si ça ne fonctionne pas, c’est bizarre, je suppose que tu as tout bien suivi à la lettre ? Pour ma part, j’ai procédé pas à pas pour trouver la bonne solution : d’abord appeler l’application dans le répertoir ou je l’ai compilé (/home/user/open2300), puis déplacer installer ensuite avec la commande make install, pas à pas donc, pour identifier d’ou viennent les problèmes).

      C’est étrange par contre que mysql2300 ne loggue pas les bonnes valeurs. Les valeurs des autres capteurs sont cohérentes ?

  9. Opanis says:

    Merci pour ces indications grâce à la solution de Thibault j’ai réussi à envoyer mes données sur wu2300.

    Maintenant il me reste à réussir à faire des crons et regarder mes problèmes avec mysql2300 où je viens aussi de perdre la température intérieur, sinon les autres valeurs sont corrects (j’ai une ws2357 et j’ai essayé sur une ws2355 et il y a le même soucis).

    Merci pour votre aide et j’espère que vos projets avancent

  10. Opanis says:

    Pour info mon probleme de données faussé ont été résolu gâce au patch suivant :
    http://www.lavrsen.dk/foswiki/bin/view/Open2300/DatabaseStructurePatch

  11. Opanis says:

    Bonjour,

    Je suis toujours entrain d’essayer de régler mon problème avec crontab, je me pose plusieurs questions est-ce que tu pourrais m’éclairer dessus :

    – pourquoi ne pas utilisé crontab -e ?
    – Y a t’il d’autre paramétrage à mettre dans le fichier crontab (SHELL, PATH, HOME …) ?

    Car la je bugue vraiment

    Autre question comme exploites-tu les données ? moi je pense utilisé l’application weather office et essayer de la moderniser en faisant des graphiques avec highcharts.

    Merci d’avance de tes réponses

    Cordialement
    opanis

    • Clément says:

      Bonjour,

      En fait crontab -e est un crontab utilisateur, qui offre moins de possibilités que le crontab système (édition /etc/crontab). Dans /etc/crontab, on peut notamment spécifier quel utilisateur doit exécuter la tâche (ce qui peut-être intéressant pour la suite, par exemple en créant un utilisateur spécifique pour open2300 qui n’aurait les droits sudo que sur les exécutables de la suite open2300, ce qui permettrait de se prémunir de certaines failles dans la suite par exemple).
      Sinon, pas de paramétrages particuliers autre à mettre dans la crontab. As tu essayé de décomposer et d’avancer pas à pas pour tenter d’identifier où se situais le problème ?

      Pour le moment les données ne sont pas exploitées. Je suis en train de me goupiller un script from scratch, avec HighCharts justement(plus AJAX et PHP derrière pour animer le tout), mais il faut que je me remette dans le PHP. Je pense que mettrais tout ça en ligne sur le blog quand ça tournera…

  12. Opanis says:

    Merci de ta réponse.

    Je pense que mon problème vient des cron je viens de tester */1 **** pi echo ‘Hello’ et rien ne se passe.

    N’y connaissant rien en linux je vais continuer à chercher.

    • Clément says:

      Ceci est normal, cron n’affiche jamais rien sur le terminal utilisateur. C’est l’une des difficultés, il n’y a aucun moyen simple (ie, configuré de base) pour avoir un retour des erreurs de cron. Il est cependant possible de configurer cron de façon à ce qu’il envoi les résultats des commandes par mail (comportement par défaut). Il faut installer mailutils pour recevoir ces mails (un début de piste ici : http://doc.ubuntu-fr.org/cron#autres_considerations).

  13. Opanis says:

    Merci clément de ta réponse.
    Je viens de réussir à faire fonctionner les cron en ne redémarrant pas sur le bureau cela fonctionne à priori cela ne fonctionne pas avec le bureau et le terminal.

  14. Pigloo says:

    Je me joins aux autres pour ton excellent article.
    Depuis 5 mois maintenant que j’essaye de faire tourner open2300 sur le RPi, même méthode. Il s’avère que open2300 fonctionne (et a toujours fonctionné à merveille), la station aussi mais le problème vient d’après ce que j’ai lu de l’adaptateur série/usb. L’adaptateur vendu avec la station me fait planter le RPi systématiquement et idem avec un cordon acheté au magasin du coin. Y aurait-il une bonne âme pour me donner les référence d’un adaptateur ou cordon qui fonctionne chez lui ?

  15. Lecerf says:

    Bonjour à tous,

    Un petit erratum et un conseil :

    La table MySQL nécessite une petite correction, WIND_ANGLE doit être DECIMAL(4,1) et REL_PRESSURE, DECIMAL(5,1).
    Sinon cela génère une erreur pour la commande INSERT MYSQL en tout cas sur mon serveur MySQL (eu égard aux valeurs prises par ces deux entités).

    Un autre conseil la commande fetch2300 ou mysql2300 peut prendre plus d’une minute pour s’exécuter, si vous choisissez de faire des relevés à la minute il est nécessaire de faire un script bash qui vérifie qu’un tel process n’est pas en cours.

    Voilà sinon très beau travail et très beau tuto

    Mille fois MERCI !!

    • Clément says:

      Bonjour et merci pour ton commentaire,

      Merci pour l’info sur le soucis dans la DB, je ne l’ai pas constaté de mon coté. C’est peut-être un paramètre qui varie en fonction de la version de MySQL présente sur la machine…

      J’ai par ailleurs aussi constaté le fait que certaines fois, le processus prend un peu de temps, et que donc les mises à jour suivantes ne sont pas faites, j’ai l’impression que le processus plante (pourtant chez moi j’ai mis 5 minutes entre 2 enregistrements… quand un process se bloque, bizarrement je n’ai plus qu’un enregistrement toutes les 10 minutes au lieu de 5). Je compte effectivement faire un script qui va même un peu plus loin, en faisant carrément un script qui tue le processus s’il ne s’est pas terminé au bout de 5 minutes, avant de lancer l’enregistrement suivant.

    • Clément says:

      Re-bonjour,

      Effectivement, tu as raison pour le rel_pressure, en l’état, il n’enregistre que jusqu’à 999,9 hPa. J’ai donc signalé cette modif dans l’article. Merci à toi.

  16. Tec says:

    Bonjour,
    Merci pour le tuto.
    J’ai une WS2357 et pas (encore) de raspberry Pi. Vous dites dans le billet disposer d’une distribution LNMP sur votre raspberry Pi, peut-on avoir le nom exact de la distrib ? (histoire de simplifier la future configuration lorsque j’aurai un raspberry Pi) Merci d’avance et super travail…

    • Clément says:

      Bonjour Tec,

      Merci pour ton commentaire. La distribution utilisée est la distribution « officielle » du Raspberry Pi : Raspbian. J’ai installé NGinx a partir de tutos trouvé sur le net à droite à gauche (je n’ai malheureusement pas pris note des dits tutos). Cela ne pose de de difficultés particulières si on suit scrupuleusement les instructions.

      N’hésites pas si tu as des questions.

  17. Tec says:

    Merci pour l’info Clément.
    Je devrais réussir à m’en sortir avec tes infos pour installer la distrib et NGinx.
    J’ai hâte de voir ce que ça donne avec HighCharts…

  18. opanis says:

    Bonjour Clement,

    Heureux de lire les modifications que tu as apporté au programme d’origine. Perso dans mon projet marche bien (arpés avoir réussi a faire focntionné les cron) depuis 2 mois le programme en enregistrant toute les 5 min et en envoyé toutes les 30 min sur wunder.
    Je pense que je vais mettre en place tes modifications surtout les sauvegardes, par contre je pense que je vais faire en sorte que la sauvegarde soit envoyé par mail en même temps au cas où que toute plante. Bonne continuation à toi .

  19. DidierRDV12 says:

    Bonjour
    joli travail ….
    quel un a une image de Systems? jai une ws2308 je ferai bien un essais
    je me suis commandez un raspberry chez snootlab.com a Toulouse
    merci

  20. sgrienen says:

    Bonjour,
    J’ai suivi ton tuto, un grand merci, ca m’a permis de redonner un coup de jeune a ma vieille station WS2307 plutot que de me jetter sur un Netatmo comme tout le monde autour de moi 🙂 et de me remettre un peu les mains dans le camboui. Ceci dit j’ai encore un soucis. J’explique rapido la situation : ma station et mon Rasp transmettent les infos a une base MySQL sur mon NAS Synology (pour eviter de stocker les infos sur le Rasp. Le tout transite par le WIFI, et a cause de ca, j’ai deja eu des plantages dus a l’alim visiblement pas assez puissante ou stable, je ne sais pas trop. J’ai remplace l’alim (1A qd mm) par celle de mon iPad (2.1A dc), et au debut c’etait a priori super stable, pendant des jours ca loggait sans planter, mais au bout d’1 moment, ca s’est remis a se planter de tps en tps. Je soupconne toujours encore le dongle WIFI d’etre responsable du truc, mais je n’en suis pas sur. Je ne sais a vraie dire pas trop ou regarder pour trouver le responsable du plantage… Une petite idee ?
    Merci !

    • Clément says:

      Il faudrait vérifier si la connexion wifi est bien active lors de plantages, et éventuellement rechercher du coté de coupures de quelques minuntes qui feraient planter mysql2300… Le serveur MySQL n’est pas planté coté NAS ? Pour confirmer cette hypothèse de wifi, j’essayerait de faire tourner quelque jours l’ensemble sur Ethernet. Si RAS c’est que ça provient bien du Wifi, sinon, c’est que ça vient d’ailleurs.
      Que donne la comamnde « ps -A | grep mysql2300 » ?
      Globalement, le wifi reste une mauvaise solution pour un serveur, mais je sais bien que parfois, c’est pas facile d’avoir une connexion Ethernet.

  21. sgrienen says:

    C’est sur, mon but est de le faire tourner sur ethernet, pas wifi, mais pour ca il faut d’abord que je tire un cable supplementaire dans ma maison. Je ferai lorsque je serai sur de la fiabilite de la chose.

    pi@raspberrypi ~ $ ps -A | grep mysql2300
    21262 ? 00:00:00 mysql2300

    • Clément says:

      Donc tu as bien une seule instance de mysql2300 qui tourne. C’est déjà ça. Cette commande a été tapée a un moment ou la connexion était plantée ou pas ?

      Je dirais que le plus simple serait de déplacer temporairement le RPi et la station a coté de la box histoire de pouvoir vérifier que c’est bien le Wifi qui pose soucis… c’est le plus simple je pense…

  22. Gildas says:

    Bonjour à tous;
    En ce qui me concerne je graphe les valeurs dans Cacti 🙂
    Via open2300 je sauvegarde dans un fichier « plat » et cacti se contente de lire le fichier et de grapher les valeurs.

    Un aperçu rapide :
    http://i.tinyuploads.com/PUxXx3.png

  23. sgrienen says:

    Alors j’ai deplace le Rasp et la station meteo a un endroit ou je pouvais avoir du reseau filaire, c’est plus stable, mais au bout d’1 moment j’ai le meme phenomene, mais moins rapidement. Quelque chose doit saturer le Rasp, je sais juste malheureusement pas quoi…

  24. Nono45 says:

    Bonjour à tous,
    Grace à ce super tutoriel, j’ai pu connecter ma station météo à mon RasPi, c’est génial.
    En revanche, j’ai un petit soucis lorsque pour X raison je dois débrancher mon RasPi.
    Le nom de l’adaptateur change, de « ttyUSB0 » il peut passer à « ttyUSB1 » et inversement.
    Y’a t’il un moyen de parer à ce soucis ?
    Cordialement.

    • clement.vermot says:

      Ceci est le comportement normal sous Linux… Pour ma part, mon adaptateur est toujours branché, donc pas de problèmes de ce coté la… Tu peux peut-être regarder de ce coté

      Tiens nous au courant !
      Clément

  25. Romain says:

    Bonjour,

    Merci pour ce tuto nikel.
    Que pensez vous du log toutes les minutes ? La base de données ne peut pas se remplir trop vite avec 43000 lignes enregistrées par mois ?
    Vous n’avez jamais rencontré de problème ?

    • Clément says:

      Effectivement, la BDD va augmenter de taille assez rapidement… sur RPi, ça peut effectivement devenir problématique en fonction des requêtes que l’on fait sur la base…

  26. Fabien says:

    Merci pour toutes ces infos, j’ai hâte de m’y coller… une réflexion qui me vient à l’esprit, est ce qu’il ne serait pas judicieux de cracher un fichier rrd (round robin database) qui pourrait facilement être traiter par un serveur de type nagios pour le monitoring des systèmes d’info. En plus, il doit y avoir moyen de faire ça en asynchrone et de lui déléguer tout ce qui à trait aux graphs non?

  27. Laurent says:

    Bonjour a tous,
    Merci bcp pour ce tuto. Je suis totalement débutant en linux et j’ai quand même réussi a installer tout ce qu’il fallait et a faire enregistrer dans la BDD local mes données. Il ne me reste plus qu’une chose c’est a afficher ces données sous forme de graphique sur un page local a laquelle j’aurais acces via XBMC. Du coup j’ai quelques questions, quelqu’un a t’il le même projet que moi et quelqu’un a t’il deja utilisé le package « WeatherGraphsPHP » que l’on trouve sur le net?
    Cordialement

  28. laurent says:

    Bonjour a tous,
    Je viens de réaliser l’integralité de ce tuto tres bien réalisé et pour le moment tout ce dont j’ai besoin fonctionne bien. Merci bcp au créateur.
    Je n’ai qu’une simple question, les enregistrements dans la base n’ont pas la bonne date et heure. J’ai deux heures de décalage alors que ma station m’affiche bien la bonne heure. quelqu’un a t’il deja eu ce probleme?

  29. Thierry says:

    Bonjour,

    A moins que je n’aie loupé quelque chose, il semble que tu n’aies pas appliqué les patches que nous fournis D. Chassignet ?
    Y a-t’il une raison particulière à ceci ?
    Par ailleurs, ce que fournit D. Chassignet pour le web est exploitable chez moi, alors que j’avais des difficultés avec ce qui est fourni, pourtant semblable, avec open2300.
    Comme le travail est en cours chez-moi, plus d’infos à venir.

    Cordialement.

    • Thierry says:

      Bonjour,

      J’aurais été plus attentif, j’aurais vu que ces modifs avaient été prises en compte.
      Bon, un petit retour sur mes essais: Le « plantage » que tu rencontres est apparemment dû au temps de cycle trop court que tu as choisi; je n’ai rencontré aucun problème avec un raffraichissement de mes mesures toutes les 10 minutes, et ça fait 5 jours que ça tourne sans interruption.
      Reste maintenant à améliorer le site Web.

      Cordialement.

      • Clément says:

        Bonjour,

        Merci pour le complément… je n’ai en effet appliqué aucun patch, mais j’ai fait quelques modifs ça et la (patch maison donc 😉 ), peut-être équivalents à ce que propose D. Chassignet (si vous avez un lien pour mon information).

        Il faudra que je change ma périodicité histoire de voir ce que cela donne…

  30. Thierry says:

    Bonjour,

    J’ai constaté que le phénomène des blocages en mémoire arrive, chez moi, à une périodicité supérieure à 1 semaine, un reboot hebdomadaire permet de ne pas rencontrer le problème: A noter que ma périodicité de relevés est de 10mn.
    Il reste à creuser les pertes liaisons entre capteurs et base qui m’arrivent souvent en ce moment.
    Je travaille à extraire les données de la base MySQL pour les affichages, ce qui permet de diminuer les échanges avec la station. Mon historique devant être uniquement celui de la base.

    • Clément says:

      Merci Thierry pour ton commentaire. Le reboot ne fait en général pas de mal effectivement…

      Tiens, tu as aussi des pertes de liaisons ? Tu es ou si c’est pas indiscret ? Car j’ai le même problème en ce moment, depuis un peu moins d’un mois (région de Bordeaux). A priori, la station voit bien un signal (le petit symbole apparait), mais toutes les informations des capteurs externes apparaissent avec un –… Je n’ai pas encore eu le temps de regarder, c’est peut-être juste les piles…

      • Thierry says:

        Désolé pour cette réponse tardive.
        J’ai toujours des problèmes de déconnexion; une cause qui m’a permis d’en éliminer une bonne part: Eloigner à 1m min. de la station PC et téléphone portable. Pour celles qui restent, certaines conditions météo doivent perturber la propagation, vu leur caractère aléatoire.

        Par contre, j’ai un doute sur la vitesse du vent: Elle doit être transmise en m/s et donc si on veut l’afficher en km/h, il faut multiplier la valeur par 3,6 ?

        Cordialement.

        • Thierry says:

          J’ai trouvé la solution pour la vitesse du vent: L’unité se configure dans le fichier /etc/open2300.conf
          J’avais oublié de dire où je réside: En Seine-Maritime, à 8km de la mer.
          Les piles, je les avais changées par précaution: Pas d’amélioration.

          Je publie ma météo sur un site free; j’ai le problème de rafraichissement des graphiques (actualisation par F5): Quelqu’un a t’il résolu ce problème ?

          • Clément says:

            Rebonjour Thierry,

            Merci pour l’information.
            Je n’ai pas eu le temps de faire des graphiques de mon côté… Je suis preneur d’infos sur la solution que tu as retenue éventuellement…

            Clément

          • Thierry says:

            J’ai « bricolé » une config à partir de l’idée de ce site:
            http://route63.free.fr/meteo/index.php

            Je t’ai mis ci-dessus l’adresse de mon site, bien sûr il y a encore pas mal de boulot puisque ça ressemble encore beaucoup au site route63 (fond de page).
            Je me suis plus attaché au fonctionnement, et je bute toujours sur les graphiques de la bibliothèque GD gérée par free. Le site en local fonctionne impec.
            A+

        • Clément says:

          Bonjour Thierry,

          Pour ma part, j’ai changé les piles dans la station, et j’ai retrouvé également une meilleur connectivité avec la sonde extérieure… ceci dit, cela n’a pas éliminé tous les soucis de connexion. J’avais l’intention de mettre en oeuvre mes moyens de radioamateurs pour voir si j’arrivais à identifier un perturbation radio, mais j’avoue que je manques un peu de temps ! Je vous tiendrai au courant ici si j’obtiens quelque chose…

          Merci pour le retour !
          Cordialement

          • Thierry says:

            Je reviens avec un retour d’expérience:
            – Certains blocages de la station, qui semblent être un problème de liaison radio, sont dûs à la liaison série: Une déconnexion/reconnexion du côté station rétablit la situation.
            – La sensibilité du système aux perturbations radios provoquées par tablettes, smartphone ou PC portables est avérées. Les tenir à plus d’un mètre de distance.
            – Les plantages en mémoire inexpliqués: la manip du kill avec egrep ne fonctionne pas chez moi. Voici par contre la solution opérationnelle que j’ai trouvée:
            ps aux | grep fetch2300 | awk ‘{print $2}’ | xargs kill -9
            Elle doit être lancée avant toute nouvelle acquisition (à adpater en fonction du programme lancer, dans mon exemple fetch2300).
            Vous pourrez voir ce que ça donne sur le site (merci à notre ami du site route 63 qui a jeté les base, et m’a largement inspiré):
            http://thierry.houx.free.fr/meteoWEB/index.php

            Ce qui reste à faire:
            Protéger de capteur T°/hygro du soleil par un système à coupelles car, pour l’instant, dès qu’il y a du soleil, le données ne veulent plus rien dire.

          • Clément says:

            Bonjour Thierry,

            Merci pour ce nouveau commentaire très complet. Merci pour l’astuce de la connexion/reconnexion. Comment procèdes tu dans ce cas la , tu débranches l’USB côté RPi ou côté prise RJ11 sur la station ? Car en cas de déconnexion côté RPi, sauf erreur, le nom de l’adaptateur série change (ttyUSB0 devient ttyUSB1 et ainsi de suite), nécessitant une reconfiguration de open2300. A ce sujet, je vient de penser qu’il serait probablement judicieux d’exploiter directement l’interface série dispo sur le Pi (via le connecteur GPIO) ce qui éviterai, je pense, pas mal d’ennuis avec ces adaptateurs RS-232 < -> USB…

            De mon côté, étrangement, les déconnexions ont cessées et semble désormais tout à fait exceptionnelles… pourtant, j’ai régulièrement mon téléphone et ma tablette pas loin… je n’ai rien changé dans l’intervalle à priori…

            Merci pour la commande plus efficace pour killer mysql2300… je testerai l’occasion !

            De mon côté, j’ai une petite applie en PHP qui tourne depuis quelques semaines pour présenter la météo : http://home.vermot.net/meteo/. Le passage d’un mot de passe en paramètre permet d’obtenir en plus les données sur le température et hygro intérieure. En cliquant sur les différentes données, on obtiens le graph d’historique… Je souhaite encore optimiser un peu certaines requêtes SQL qui prennent trop de temps à mon goût et il faudra que je jette un oeil sur un petit soucis sous Firefox à priori. Je pense que j’essayerai de faire un article à ce sujet sur ce blog dans les semaines qui viennent…

            Pour la protection solaire des capteurs, j »était tombé sur ceci http://www.station-meteo.com/plan-abri-meteo/ , simple et efficace j’imagine !

            Clément

          • Thierry says:

            Pour la deconnexion : Côté station; si faite coté RaspBerry, reboot derrière.

            Les connexions: Je pense qu’on est tributaire de la propagation, qui évolue en fonction des saisons et du temps.

            Bien ton site, notamment le graphique. Attention police un peu grande dans le tableau du dessus: Chez moi Pression atmophérique et pluie totale sont tronqués.

            Protection capteurs: C’est bien ce que je compte monter.

          • Clément says:

            Merci pour les informations sur la déconnexion, nous sommes d’accord… cependant, je n’explique pas qu’une déconnexion côté station change quelque chose… en dehors des interrogations de la station, aucune donnée ne transite probablement sur la liaison.

            Pour les pertes de connexions, je pense plus à des perturbations/brouillages… sur ces distances, des variations de propagation n’expliquent rien pour moi…
            Il faut que effectivement je regarde encore sur les tailles de polices et la compatibilité entre les différents navigateurs…

          • Thierry says:

            La déconnexion aborte pour moi une file d’attente en mémoire qui, au bout d’un certain temps doit provoquer un débordement dans sa mémoire. En tous cas, après déconnexion, on retrouve la liaison avec les capteurs et retour des données.

            Là où j’habite, les perturbations ne peuvent venir que de la maison. Je suis d’accord que vu la fréquence d’émission, la gène occasionnée par la propagation doit être faible, mais comme en même temps la puissance du signal aussi ?

  31. Los says:

    Salut,

    Super post. Pour compléter tout ça et dans la continuité de ton travail il peut aussi être interessant de :
    -poster les informations de température, humidité… indoor récupérées par la base de ta station météo si elle est en indoor et publier tout ça sur emoncms.org par exemple
    -récupérer toutes ces informations pour afficher tout ça sur on bureau dans un beau conky

    Voilà un aperçu de ce que ça peut donner :
    https://github.com/Lahorde/pws

    Cordialement.

  32. Thierry says:

    Bonjour,

    Je reviens avec un complément d’info:
    Les blocages de liaisons ont été résolus de la façon suivante:
    Par cron, je lance un job acq_meteo.sh qui contient ce qui suit:
    #!/bin/bash
    # Role: Programme maître de lancement des acquisitions:
    # Tue le précédent processus s’il pas terminé.
    # Lance le nouveau cycle d’acquisitions.
    #
    #
    /usr/local/bin/clear_2300.sh
    /usr/local/bin/acq_donn_w2300.sh

    le job clear_2300.sh contient:
    #!/bin/bash
    # Role: Tuer le programme resté en mémoire avant de lancer le processus
    # suivant.
    #
    ps aux | grep acq_donn_w2300.sh | awk ‘{print $2}’ | xargs kill -9

    Et le job acq_donn_w2300.sh est celui qui lance les acquisitions .

    Pourquoi ce choix: acq_donn_w2300.sh quand il est lancé est le processus père des acquisitions. Si une des acquisitons reste bloquée, il reste en mémoire.

    Quand cron lance l’acquisition suivante, avec clear_2300.sh on regarde d’abord si le processus père acq_donn_w2300.sh de l’acquisiton précédente est toujours présent en mémoire; si oui, on le tue ce qui a pour effet de tuer les processus fils. On peut alors lancer le processus d’acquisition suivant.

    Par contre, j’ai toujours des problèmes de perturbations radio. J’envisage de déplacer les capteurs pour les rapprocher et ainsi disposer d’un signal plus fort.

    Cordialement.

    • Thierry says:

      Bonjour,

      Derniers constats et solutions:
      Les pertes de liaisons ne sont finalement pas dues à des problèmes de propagation mais au cordon de liaison USB-RS232. Il semble que chez moi ce dernier s’est dégradé au point de tout bloquer.
      Il faut quand chercher bien longtemps pour identifier qu’une liaison série avec l’ordinateur (Pi) est la cause du blocage des acquisitions!

      Donc, en complément de ce qui est écrit ci-dessus, qui débloque le processus en mémoire du Pi, il s’agit de débloquer la liaison série.
      Pour ce faire, j’ai choisi de continuer le processus décrit précédemment (post du 9 octobre 2015) et d’ajouter un script qui:
      – Décharge le module pilote de la liaison USB série.
      – Réinitialise le port USB concerné
      – Recharge le module pilote de la liaison USB série.

      La difficulté, c’est qu’il n’existe pas de commande en natif pour réinitialiser un port USB; il a fallu rechercher pour trouver quelque chose qui le fasse.
      Finalement, j’ai trouvé un petit programme en C qui le fasse: usbreset.c dont le listing est ci-dessous:
      /* usbreset — send a USB port reset to a USB device */
      /* Programme de Alan Stern venant du site: */
      /* https://marc.info/?l=linux-usb&m=121459435621262&w=2 */
      /* ——————————————————————- */
      /* Compilation: cc usbreset.c -o usbreset */
      /* Utilisation: lsusb pour identifier le port a reinitialiser */
      /* on obtient (par exemple): */
      /* Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. */
      /* Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub */
      /* Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. */
      /* Bus 001 Device 004: ID 7392:7811 Edimax Technology Co., Ltd EW-7811 */
      /* Un 802.11n W$ */
      /* Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 */
      /* Serial Port */
      /* Le port qui nous intéresse est celui concernant PL2303 Serial Port */
      /* La commande sera: usbreset /dev/bus/usb/001/005 */

      #include
      #include
      #include
      #include
      #include
      #include

      int main(int argc, char **argv)
      {
      const char *filename;
      int fd;
      int rc;

      if (argc != 2) {
      fprintf(stderr, « Usage: usbreset device-filename\n »);
      return 1;
      }
      filename = argv[1];

      fd = open(filename, O_WRONLY);
      if (fd < 0) {
      perror("Error opening output file");
      return 1;
      }
      printf("Resetting USB device %s\n", filename);
      rc = ioctl(fd, USBDEVFS_RESET, 0);
      if (rc < 0) {
      perror("Error in ioctl");
      return 1;
      }
      printf("Reset successful\n");

      close(fd);
      return 0;
      }

      Une fois compilé, rendre exécutable le binaire (chmod +x usbreset) et le copier dans le répertoire /usr/local/bin
      Ecrire ensuite dans /usr/local/bin le script: resetusbserial.sh

      #/bin/sh
      # Decharger le module usb de la liaison serie
      modprobe -rf pl2303

      # Reinitialisation de la liaison usb serie
      # Pour connaitre quel port USB doit etre reinitialise, utiliser la
      # commande lsub, reperer dans le retour de la commande la ligne
      # contenant: PL2303 Serial Port et recuperer les valeurs Bus et
      # Device pour lancer la commande:
      # usbreset /dev/bus/usb/Bus/Device
      /usr/local/bin/usbreset /dev/bus/usb/001/005

      # Recharger le module
      modprobe -a pl2303

      Une fois écrit, le rendre exécutable.
      Modifier le script acq_meteo.sh décrit dans le précédent message comme suit:
      #!/bin/bash
      # Role: Programme maitre de lancement des acquisitions:
      # Tue le precedent processus s'il pas termine.
      # Lance le nouveau cycle d'acquisitions.
      # Reinitialiser la liaison serie
      #
      #
      /usr/local/bin/clear_2300.sh
      /usr/local/bin/acq_donn_w2300.sh
      /usr/local/bin/resetusbserial.sh

      Bon, maintenant avec tout ceci j'ai un système à nouveau opérationnel. Que de temps et d'essais pour en arriver là. C'est certainement la rançon d'utiliser du matériel "cheap", mais pour l'instant je dois m'en contenter.

      J'espère que tout ceci pourra aider ceux qui voudrons tenter l'aventure.

      • Clément says:

        Bonjour,

        Merci pour ces détails, et pour l’enquête… je vais éditer le billet pour les renvoyer vers ces commentaires très intéressants.

        Clément

        • Thierry says:

          Bonjour,

          Comme je l’avais écrit, la cause du problème est due à la dégradation progressive du cordon série. Ce que je vous ai communiqué précédemment a permis de retrouver un fonctionnement satisfaisant pendant plusieurs jours, une dizaine environ. Cependant, ce fichu cordon a persisté pour arriver jusqu’au blocage de la station; il suffisait alors de le débrancher pour que notre station fonctionne à nouveau (avec une attente de plusieurs heures pour trouver à nouveau une liaison avec les capteurs).
          Cette situation étant bloquée, je me suis mis en quête d’un cordon de bonne facture qui puisse assurer cette liaison. Chez Amazon, j’ai commandé celui-ci:
          http://www.amazon.fr/gp/product/B00QUZY4WO?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00
          Installé depuis hier, il a permis de retrouver une liaison stable avec la station (on peut retirer le déchargement / rechargement de module et la réinitialisation). Au terme de quelques heures, la liaison avec les capteurs extérieurs est revenue (je n’ai pas d’explication pour cette latence).
          Le script acq_meteo.sh décrit précédemment est maintenant suffisant comme suit:
          #!/bin/bash
          # Role: Programme maitre de lancement des acquisitions:
          # Tue le precedent processus s’il pas termine.
          # Lance le nouveau cycle d’acquisitions.
          #
          #
          /usr/local/bin/clear_2300.sh
          /usr/local/bin/acq_donn_w2300.sh

          J’espère maintenant pouvoir me consacrer uniquement à l’exploitation des données recueillies, et au site web.
          Pour tous: j’espère que mon expérience pourra vous aider.
          Pour Clément: Merci pour ce fil dans ton blog.

          Cordialement.

Laisser un commentaire

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