Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
14 février 2010 7 14 /02 /février /2010 21:24



La station météo ws2300 est la moin cher des station conectable à un PC offrant tous les équipement (anémomtre, hygrometre, temperature interieru/exterieur, plusiometre,..)

http://www.nouveauxobjets.com/2300noiredw.jpg

Objectif

1) recuperer les infos de la station pour les envoyer vers une Base de donnée (ici Mysql 5.0)
2) créer une petite page web

Source et Inspiration

http://vesta.homelinux.net/mediawiki/index.php/Connecter_la_station_meteo_Ws2300_sous_Linux

Installation

On utilise les sources de : http://www.lavrsen.dk/twiki/bin/view/Open2300/DownloadFiles
version actuelle : 1.11

note, on travaille dans un repertoire de preparation : ~/Build
cd ~/Build
mkdir open2300-svn
cd open2300-svn
sudo aptitude install subversion libmysqlclient-dev build-essential

svn co http://www.lavrsen.dk/svn/open2300/trunk/ .


On build les sources:
$ make
$ make mysql2300
$ sudo make install
mkdir -p /usr/local/bin
install open2300 /usr/local/bin
install dump2300 /usr/local/bin
install log2300 /usr/local/bin
install fetch2300 /usr/local/bin
install wu2300 /usr/local/bin
install cw2300 /usr/local/bin
install histlog2300 /usr/local/bin
install xml2300 /usr/local/bin
install light2300 /usr/local/bin
install interval2300 /usr/local/bin
install minmax2300 /usr/local/bin
install mysql2300 /usr/local/bin
install mysqlhistlog2300 /usr/local/bin

$sudo install open2300-dist.conf /etc/open2300.conf

Creation de la base de donnée

J'ai tout fait à l'aide de phpmyadmin, mais les commandes sont les suivantes :
On se log root sur la base. On crée la base meteo. On crée un utilisateur  "meteo" avec le password "***" et on lui donne lmes droits de manipuler les données de la base météo.

$ mysql -u root -p
mysql> CREATE
DATABASE `meteo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> CREATE USER 'meteo'@'localhost' IDENTIFIED BY '***';

GRANT USAGE ON * . * TO 'meteo'@'localhost' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 7200 MAX_CONNECTIONS_PER_HOUR 7200 MAX_UPDATES_PER_HOUR 7200 MAX_USER_CONNECTIONS 10 ;

mysql>GRANT SELECT , INSERT , UPDATE , DELETE ON `meteo` . * TO 'meteo'@'localhost';
mysql> exit

Puis on sort de la base et on injecte la structure de la table "weather"

 $ mysql --user=root --password=password_de_root_pour_la_base meteo <./mysql2300.sql


Configuration

 On fait une sauvegarde du fichier de configuration initial
sudo cp -a /etc/open2300.conf /etc/open2300.conf.ori

La configuration sera appliqué en utilisant la commande patch à partir du ficher de patch suivant :
$ cat open2300-conf.patch
--- /etc/open2300.conf 2010-02-14 21:42:59.000000000 +0100
+++ ./open2300.conf 2010-02-14 22:16:49.000000000 +0100
@@ -55,9 +55,9 @@
### MYSQL Settings (only used by mysql2300)

MYSQL_HOST localhost # Localhost or IP address/host name
-MYSQL_USERNAME open2300 # Name of the MySQL user that has access to the database
-MYSQL_PASSWORD mysql2300 # Password for the MySQL user
-MYSQL_DATABASE open2300 # Named of your database
+MYSQL_USERNAME meteo # Name of the MySQL user that has access to the database
+MYSQL_PASSWORD xxxxxx # Password for the MySQL user
+MYSQL_DATABASE meteo # Named of your database
MYSQL_PORT 0 # TCP/IP Port number. Zero means default

#PGSQL_CONNECT hostaddr='127.0.0.1'dbname='open2300'user='postgres'password='sql' # Connection string
Il vous faut creer le fichier "open2300-conf.patch" y coller les lignes ci dessus, remplir la lignes "xxxx" avc le bon mot de passe.

Puis patcher le fichier de conf :
$ sudo patch -p0 /etc/open2300.conf open2300-conf.patch
patching file /etc/open2300.conf

Teste et reglages

 après toutes ces donf, on effectue quelques testes :
accès au données :
fetch2300

Unable to open serial device /dev/ttyS0

En effet, on n'a pas reglé le probleme de l'accès au device /dev/ttyS0 c'est à dire le port Série 0.
$ ls -lsa /dev/ttyS0
0 crw-rw---- 1 root dialout 4, 64 2010-02-14 13:21 /dev/ttyS0

Pour regler le probleme, on va créer un utilisateur dans la base de compte systeme - que l'on nomera aussi meteo - membre du groupe dialout. Ce compte sera aussi utilisé pour injecter les datas dans la base.

sudo useradd -c "utilisateur ws2300" --gid `grep dialout /etc/group |cut -d: -f3` -m -d /var/run/meteo -s /bin/sh meteo

On vérifié que ça fonctionne :
$ sudo su meteo -c fetch2300

Date 2010-Feb-14
Time 22:46:44
Ti 10.1
Timin 6.0
Timax 35.8
TTimin 09:25
DTimin 2007-01-27
TTimax 18:19
DTimax 2008-08-05
To -1.6
Tomin -30.0
Tomax 45.1
TTomin 15:54
DTomin 2003-05-04
TTomax 16:58
DTomax 2006-07-23
DP -11.8
DPmin -24.9
DPmax 23.3
TDPmin 04:17
DDPmin 2005-03-01
TDPmax 17:35
DDPmax 2004-08-18
RHi 31
RHimin 19
RHimax 78
TRHimin 14:12
DRHimin 2010-02-04
TRHimax 17:27
DRHimax 2008-11-01
RHo 46
RHomin 0
RHomax 96
TRHomin 06:08
DRHomin 2006-10-31
TRHomax 13:19
DRHomax 2010-02-09
WS 0.7
DIRtext N
DIR0 0.0
DIR1 337.5
DIR2 337.5
DIR3 337.5
DIR4 0.0
DIR5 0.0
WC -1.6
WCmin -30.0
WCmax 45.1
TWCmin 21:55
DWCmin 2007-04-21
TWCmax 16:58
DWCmax 2006-07-23
WSmin 0.0
WSmax 48.2
TWSmin 21:40
DWSmin 2010-02-04
TWSmax 15:00
DWSmax 2007-09-27
R1h 0.00
R1hmax 198.91
TR1hmax 18:00
DR1hmax 2007-09-17
R24h 0.00
R24hmax 134.16
TR24hmax 16:51
DR24hmax 2007-09-18
Rtot 1255.11
TRtot 08:05
DRtot 2004-01-31
RP 1009.400
RPmin 981.600
RPmax 1039.100
TRPmin 12:44
DRPmin 2008-11-24
TRPmax 12:23
DRPmax 2008-02-17
Tendency Rising
Forecast Sunny

Collecte des datas

 Il ne reste plus qu'a collecter les datas à l'aide d'une crontab et les faire injecté dans la base:
sudo su -c "echo -e '#\n# insertion des releve meteo dans la base\n*/5 * * * *\tmeteo\t/usr/local/bin/mysql2300' >>/etc/crontab"

Le Bonus

 Le bonus on publie les valeurs directement de la base vers Weatcher Underground

<code>
 #!/bin/bash
# By Domos
# /usr/local/sbin/mysql2wu2300
date=$(date '+%s')
data=$(mysql -s -u meteo -p$(cat ~/.mysql.txt) -D meteo << !
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 60 ]

then

echo "Données Ws2300 plus à jour !"

exit 1

fi



BASEURL_wu="weatherstation.wunderground.com"

PATH_wu="/weatherstation/updateweatherstation.php"

ID_wu="id"

PASSWORD_wu="passwd"

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
 
Quelques commentaire :
le fichier ~/.mysql.txt et en fait le fichier /var/run/meteo/.mysql.txt
- il faut y placer le password du compte meteo
- et les droits suivants
# chown meteo.root ~meteo/.mysql.txt
# chmod 400 ~meteo/.mysql.txt
Les variables :
- ID_wu : le loggin sur Weather Underground
- PASSWORD : le password sur WU
Le script et dans /usr/local/sbin avec les droits suivants:
# chown root.root /usr/local/sbin/mysql2wu2300
# chmod 755 /usr/local/sbin/mysql2wu2300
;

Et on fait executer le tout par une crontab 1 fois toutes les 10 minutes :

sudo su -c "echo -e '# export des releve meteo vers WU \n*/10 * * * *\tmeteo\t/usr/local/sbin/mysql2wu2300' >>/etc/crontab"
;

Migration v 1.10 a v1.11

 
il faut modifier la structure de la base :

ALTER TABLE `meteo`.`weather` DROP COLUMN `rec_date`;
ALTER TABLE `meteo`.`weather` DROP COLUMN `rec_time`;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `timestamp` `datetime` DATETIME NOT NULL DEFAULT 0;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `windspeed` `wind_speed` DECIMAL(3,1) NOT NULL DEFAULT 0;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `rel_pressure` `rel_pressure` DECIMAL(5,1) NOT NULL;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `rain_total` `rain_total` DECIMAL(5,1) NOT NULL;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `wind_angle` `wind_angle` DECIMAL(4,1) NOT NULL;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `temp_in` `temp_in` DECIMAL(4,1) NOT NULL DEFAULT 0;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `temp_out` `temp_out` DECIMAL(4,1) NOT NULL DEFAULT 0;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `dewpoint` `dewpoint` DECIMAL(4,1) NOT NULL DEFAULT 0;
ALTER TABLE `meteo`.`weather` CHANGE COLUMN `wind_chill` `wind_chill` DECIMAL(4,1) NOT NULL DEFAULT 0;

Partager cet article

Repost 0
Published by nitocris - dans Linux
commenter cet article

commentaires

Ookpik 07/06/2012 17:48

Salut nitocris,
Il y a encore du monde qui utilise une lacrosse WS2300 :)
Jusqu'ici, j'utilisais open2300 sous Ubuntu 10.04 et avac aucun problème, depuis que j'ai migré sous la 12.04, c'est une galère...
Unable to open serial device /dev/ttyS0
J'aimerais savoir comment faire pour accorder les droits permanents à l'utilisateur courant, je n'ai pas envie de passer par un adduser "meteo"
Si tu as la solution :)