Surveillance de la temp�rature avec Linux (2)

ArticleCategory: [Choose a category, translators: do not translate this, see list below for available categories]

Software Development

AuthorImage:[Here we need a little image from you]

Stefan
    Blechschmidt

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in de Stefan Blechschmidt

de to en Jürgen Pohl

en to fr Jean-Etienne Poirrier

AboutTheAuthor:[A small biography about the author]

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.

Abstract:[Here you write a little summary]

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.

ArticleIllustration:[One image that will end up at the top of the article]

Titelbild

ArticleBody:[The main part of the article]

Pr�-requis

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 ;-)

Mise en place de la base de donn�es

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.

Note:

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.

V�rification :

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

Entrer des donn�es dans notre base de donn�es

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.

Note:

Des modules Perl pour tout type d'applications peuvent �tre trouv�s dans le � Comprehensive Perl Archive Network (CPAN, http://www.cpan.org/) �. Je passe la description de l'installation et vous renvoie vers :
http://www.pro-linux.de/news/2002/0070.html
ou
http://www.linux-magazin.de/Artikel/ausgabe/1997/10/CPAN/cpan.html
.
#!/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;

Une br�ve explication du programme :

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 et CGI

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.

Sortie Graphique

graphique

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.

  1. G�n�rer l'�chelle de l'axe des X
  2. Donn�es du premier Capteur (sensor0)
  3. Donn�es du second Capteur (sensor1)

Seules les requ�tes doivent �tre modifi�es pour g�n�rer diff�rentes sorties graphiques.

Requ�tes SQL

Finalement, je souhaite vous montrer quelques requ�tes SQL car elles sont le sujet principal de cet exemple.

Les cinq derni�res mesures

    select tag, monat, zeit,
     DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung
       from sensor0
       order by id desc
         limit 5;

Le jour le plus froid de l'ann�e

    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

Le jour le plus chaud de l'ann�e

    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

Calculer la moyenne arithm�tique du jour

   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)

Conclusion

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.

T�l�chargement

Liens / R�f�rences