original in de Stefan Blechschmidt
de to en Jürgen Pohl
en to fr Jean-Etienne Poirrier
Electricien qualifi�, je me suis retrouv�, en 1990, devant une station de travail de DAO pour d�velopper une station de commutateur et de commande. Evidemment, j'ai �t� infect� par un � virus � inconnu alors et c'�tait parfait.
Dans l'�dition de novembre 2003, Surveillance de temp�rature avec Linux, je d�taillais un circuit qui nous permet de collecter les donn�es de temp�rature avec Linux. Pour �valuer ces donn�es de temp�rature, nous devons les stocker dans une base de donn�es.
Pour obtenir le maximum de b�n�fices de cet article, nous allons afficher graphiquement les donn�es � travers une interface web.
Quelques applications courantes devraient d�j� �tre install�es sur votre ordinateur :
Comme nous l'indiquons, cet article est destin� aux utilisateurs un tant soit peu avan��s de Linux. Pour ceux qui ne sont pas encore � ce stade, cela sera une bonne introduction ;-)
Dans MySQL, le programme mysql fournit l'interface � la base de
donn�es. Avec la commande mysql -u root -p
mysql
, nous nous connectons au moniteur de MySQL.
Avec l'option -u
, l'utilisateur
peut �tre saisi. L'option -u
va
demander un mot de passe et, finalement, la base de donn�es � utiliser doit
�tre saisie. Dans notre cas, nous s�lectionnons le Gestionnaire de base de
donn�es de MySQL.
Vous allez recevoir alors l'invite mysql
>
pour y entrer des commandes SQL. Tout d'abord, nous devons
trouver quel type de tables se trouve dans la base de donn�es. La commande
show tables;
fait cela.
mysql> show tables; +-----------------+ | Tables_in_mysql | +-----------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-----------------+ 6 rows in set (0.00 sec)
Maintenant, nous devons cr�er la base de donn�es pour nos donn�es de
temp�rature. Avec la commande create
database digidb
, nous g�n�rons notre base de donn�es nomm�e
digidb et avec la commande exit
, nous pouvons quitter le gestionnaire car les commandes
additionnelles vont �tre entr�es d'une autre mani�re.
MySQL poss�de un administrateur qui, en g�n�ral, est aussi nomm�
root. L'installation par d�faut ne requiert pas de mot de passe.
Avec la commande mysqladmin -u root -p mot
de passe secret
, nous changeons le mot de passe pour l'utilisateur
root en secret.
Pour rendre active cette modification, la table de l'administrateur doit
�tre lue de nouveau ; nous faisons cela avec la commande
mysqladmin -u root -p
flush-privileges
. A partir de maintenant, l'utilisateur root
doit donner un mot de passe pour chaque acc�s � la base de donn�es.
Entrer des commandes via la ligne de commande est tr�s compliqu�. Cependant, MySQL offre une autre possibilit� de le r�aliser.
Pour ce faire, nous entrons un fichier texte avec des commandes SQL en ajoutant un � < � � la commande mysql.
Pour montrer ceci, nous �crivons un fichier texte qui g�n�rera la premi�re table pour le capteur 0.
Dans ce fichier, sensor0.sql, nous �crivons les commandes pour cr�er la table ; cela pourrait ressembler � ceci.
CREATE TABLE sensor0 ( id int(11) NOT NULL auto_increment, monat char(3) NOT NULL default '', tag char(2) NOT NULL default '', dbtime timestamp(14) NOT NULL, zeit time NOT NULL default '00:00:00', messung decimal(4,2) NOT NULL default '0.00', PRIMARY KEY (id) ) TYPE=MyISAM;
Cela sera entr� avec :
mysql -u digitemp -p digitemp <
sensor0.sql
Puisque nous utilisons 2 capteurs, nous ne devons que copier le fichier
et modifier la ligne CREATE TABLE
sensor0
en CREATE TABLE
sensor1
.
A ce niveau, il devrait �tre �vident qu'entrer les commandes SQL � l'aide d'un fichier a de r�els avantages.
Pour afficher les tables nouvellement cr��es, nous utilisons la
commande : echo 'show tables' | mysql -u
root -p digidb
; bien s�r, cela fonctionne �galement par d'autres
m�thodes.
Si nous avons r�alis� tout correctement, nous verrons la sortie suivante :
Enter password: Tables_in_digidb sensor0 sensor1
Un petit programme Perl va effectuer le transfert des donn�es dans la base de donn�es. Pour cela, notre premier module Perl (DBI) va �tre utilis� : il va fournir les m�thodes d'acc�s � la base de donn�es.
#!/usr/bin/perl -w # # Digitemp pr�paration du fichier de log et sauvegarde dans une base de donn�es # sbs 2003-08-09 # use DBI; use strict; # Initialisation de la base de donn�es my $datasource = "dbi:mysql:database=digidb"; my $user = "root"; my $pass = "secret"; my $db = DBI->connect($datasource, $user, $pass) or "Connection � la base de donn�es impossible : " . $DBI::errstr; # Filtration de Digitemp while(<STDIN>) { chomp; # Passer le nom du programme (de l'output) next if (m/Digi.*/); # Passer la ligne blanche (dans l'output) next if (m/^$/); # Passer tout jusque Fahrenheit (dans l'output) m/(.*).F.*/; my $templine = $1; # Divise la ligne temp et sauvegarde dans des variables my ($monat, $tag, $zeit, $sensor_txt, $sensor_nr, $grad_txt, $grad_wert) = split(/ /,$tempzeile); # Remplir la base de donn�es $db->do( "insert into sensor$sensor_nr (monat, tag, zeit, messung) values ('$monat', '$tag', '$zeit','$grad_wert')") or die "Pas possible : " . $db->errstr(); }# END- Filtre Digitemp # Ferme la base de donn�es $db->disconnect;
Le programme ne fait pas r�ellement grand chose : il ouvre la base de donn�es, lit la sortie qu'il re�oit de digitemp, filtre tout ce dont nous n'avons pas besoin et �crit les donn�es int�ressantes dans la table correcte de la base de donn�es.
La collecte continue des donn�es est r�alis�e avec le travail �prouv� de cron :
0-59/15 * * * * root /root/bin/digitemp -a | /root/bin/digipipe.pl
C'est tout pour la collecte des donn�es ; maintenant, au tour de l'interface.
Perl nous offre l'environnement appropri� pour cette t�che.
Tout d'abord, nous devons conna�tre le r�pertoire o� Apache ex�cute ses
programmes CGI. Cela peut �tre trouv� dans les fichiers de configuration
d'Apache. Cherchez une ligne comme celle-ci :
<Directory
/usr/lib/cgi-bin>
.
Avant de commencer avec la sortie graphique, nous allons d'abord �crire un programme qui nous fournit les derni�res donn�es mesur�es.
Il serait int�ressant de stocker ces donn�es dans un
sous-r�pertoire s�par� ; vous devez aussi rendre votre programme
ex�cutable : chmod 755
nomduprogramme
.
Nous devons limiter la sortie aux derni�res donn�es et les entrer dans un programme Perl-CGI. Cela sera fait avec une requ�te SQL.
#!/usr/bin/perl use DBI; use strict; # Initialisation de la base de donn�e my $datasource = "dbi:mysql:database=digidb"; my $user = "root"; my $pass = "secret"; my $db = DBI->connect($datasource, $user, $pass) or "Connection � la base de donn�e impossible : " . $DBI::errstr; # Param�tres de travail de la base de donn�es my $sql; my $sth; # Param�tre de travail des senseurs my $temp; my $zeit; # Pr�paration de la sortie HTML print "Content-type: text/html\n\n"; # Sortie des mesures des senseurs individuels $sql = "select messung, zeit from sensor$i order by id desc limit 1;"; $sth = $db->prepare($sql) or die "prepare impossible"; $sth->execute() or die "execute impossible"; ($temp, $zeit) = $sth->fetchrow_array(); $sth->finish(); print "<p>Temp Senseur$i: <b>[$temp]</b> $zeit</p>"; } # Fermer la base de donn�es $db->disconnect;
Cet exemple n'est pas le plus �l�gant ; il est seulement pour d�montrer la mani�re dont ce travail peut �tre accompli simplement avec Perl.
Maintenant, attaquons-nous � la sortie graphique. Le programme (� t�l�charger � la fin de cet article) g�n�re la courbe graphique ; pour en savoir plus sur les graphiques, regardez les autres modules GD.
De plus, le programme utilisent le module CGI qui permet une sortie HTML avec Perl. Je me r�f�re ici aux nombreuses descriptions � ce sujet sur Internet.
Retour au programme... Il comprend une partie principale et deux sous-programmes. Un sous-programme est responsable de la requ�te SQL, le second est responsable des graphiques.
Seulement trois requ�tes sont effectu�es par la partie principale et les donn�es sont pass�es aux sous-programmes.
Seules les requ�tes doivent �tre modifi�es pour g�n�rer diff�rentes sorties graphiques.
Finalement, je souhaite vous montrer quelques requ�tes SQL car elles sont le sujet principal de cet exemple.
select tag, monat, zeit, DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung from sensor0 order by id desc limit 5;
select tag, monat, zeit, DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung from sensor1 where YEAR(dbtime) = YEAR(NOW()) order by messung asc limit 1
select tag, monat, zeit, DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung from sensor1 where YEAR(dbtime) = YEAR(NOW()) order by messung desc limit 1
select day, month, YEAR(dbtime) as Jahr, sum(messung)/count(*) as Durchschnitt from sensor1 where YEAR(dbtime) = YEAR(NOW()) and DAYOFMONTH(dbtime)= DAYOFMONTH(NOW()) and MONTHNAME(dbtime) = MONTHNAME(NOW()) group by DAYOFMONTH(dbtime)
Je suis toujours surpris de la simplicit� avec laquelle des programmes peuvent �tre �crits en Perl. En fait, ils ne sont pas r�ellement �crits mais copi�s et les sections sont combin�es. D'une certaine mani�re, tout cela existe d�j� quelque part sous une forme ou une autre.
J'esp�re que j'ai pu vous fournir un petit aper�u sur les sujets de Perl, CGI et MySQL.