Monitoreo de Temperatura con Linux (Parte 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 es Jos� Manuel Gonz�lez Calvar

AboutTheAuthor:

Electricista confirmado, me encontr� a mi mismo en 1990 delante de una estaci�n de trabajo CAD para desarrollar una estaci�n de control y conmutaci�n. Obviamente, me infect� por un 'virus' entonces desconocido.

Abstract:

En la edici�n de Noviembre de 2003 Monitoreo de Temperatura con Linux mostr� un circuito que nos permit�a recoger datos de temperatura a trav�s de Linux. Para evaluar los datos de temperatura, deber�amos guardarlos en una base de datos.

Para obtener la m�xima ventaja de este art�culo mostraremos los datos gr�ficamente a trav�s de un interfaz web.

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

Titelbild

ArticleBody:[The main part of the article]

Prerrequisitos

Algunas aplicaciones deber�an estar instaladas en tu ordenador

Como estamos mostrando, este art�culo es para usuarios de Linux algo avanzados. Para aquellos que todav�a no lo son, ser� una buena introducci�n ;-)

Preparando La Base De Datos

En MySQL el programa mysql nos provee de un interfaz hacia la base de datos. Con el comando mysql -u root -p mysql conectamos al monitor MySQL.

Con la opci�n -u introduciremos el usuario. La opci�n -p pedir� la contrase�a, y finalmente habr� que seleccionar la base de datos que se va a usar. En nuestro caso estamos seleccionando la base de datos maestra de MySQL.

Estar�s en el prompt de mysql > para introducir los comandos SQL. Al principio necesitaremos descubrir qu� clase de tablas hay en la base de datos. El comando show tables; hace esto.

mysql> show tables;
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv    |
| db              |
| func            |
| host            |
| tables_priv     |
| user            |
+-----------------+
6 rows in set (0.00 sec)

Ahora tenemos que crear nuestra base de datos para nuestros datos de temperatura. Con el comando create database digidb generamos nuestra base de datos llamada digidb y con el comando exit podemos salir del monitor, ya que los siguientes comandos los introduciremos de otra manera.

Nota:

MySQL tiene una administrador que normalmente se llama tambi�n root. La instalaci�n por defecto no requiere una contrase�a. Con el comando mysqladmin -u root -p password geheim estamos cambiando la contrase�a del usuario root a geheim.

Para hacer esta modificaci�n efectiva, la tabla del administrador tiene que ser leida de nuevo, hacemos eso con el comando mysqladmin -u root -p flush-privileges. Desde ahora el usuario root tiene que proporcionar la contrase�a cada vez que accede a la base de datos.

Escribir comandos a trav�s del monitor es muy complicado, sin embargo MySQL ofrece otra posibilidad para escribir comandos.

Para hacer esto introducimos un archivo de texto con los comandos SQL a�adiendo un "<" al comando mysql.

Para mostrar esto, escribiremos un archivo de texto para generar la primera tabla para sensor 0.

En este archivo sensor0.sql escribimos los comandos para crear la tabla, deber�a parecerse a esto.

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;

Lo introduciremos con:
mysql -u digitemp -p digitemp < sensor0.sql

Como estamos utilizando s�lo dos sensores, necesitaremos s�lo copiar el archivo y modificar la linea CREATE TABLE sensor0 pr CREATE TABLE sensor1.

Llegados a este punto deber�a ser m�s convincente que es m�s ventajoso escribir comandos SQL por medio de un archivo.

Probando :

Para mostrar las nuevas tablas generadas utilizamos el comando: echo 'show tables' | mysql -u root -p digidb, por supuesto tambi�n funciona en orden inverso.

Si lo hemos hecho todo correctamente tendremos la siguiente salida:

 Enter password:
 Tables_in_digidb
 sensor0
 sensor1

Introduciendo Datos en nuestra Base de Datos

Un peque�o programa en Perl har� la transferencia de datos a la base de datos. Para esto ser� utilizado nuestro primer m�dulo de perl (DBI), nos proporcionar� el m�todo de acceso a la base de datos.

Nota:

M�dulos de Perl para toda clase de aplicaciones pueden ser encontrados en 'Comprehensive Perl Archive Network (CPAN, http://www.cpan.org/)' . Me salto la descripci�n de la instalaci�n y te remito a:
http://www.pro-linux.de/news/2002/0070.html
or
http://www.linux-magazin.de/Artikel/ausgabe/1997/10/CPAN/cpan.html
.
#!/usr/bin/perl -w
#
# Digitemp preparaci�n de el archivo de log y guard�ndolo
en la base de datos

# sbs 2003-08-09
#
use DBI;
use strict;

# Inicializaci�n de la base de datos

my $datasource = "dbi:mysql:database=digidb";
my $user = "root";
my $pass = "geheim";

my $db = DBI->connect($datasource, $user, $pass)
  or  "Verbindung zur Datenbank nicht m�glich: " . $DBI::errstr;

# Filtrado de Digitemp
while(<STDIN>) {
 chomp;
 # Saltando en la salida el nombre del programa
 next if (m/Digi.*/);
 # Saltando en la salida las l�neas en blanco
 next if (m/^$/);
 # Saltando todo en Farenheit
 m/(.*).F.*/;
 my $templine = $1;

 # Dividiendo linea de temperatura y guardando en variables
 my ($monat, $tag, $zeit, $sensor_txt, $sensor_nr, $grad_txt,
 $grad_wert)
 = split(/ /,$tempzeile);

 # Llenando la base de datos
 $db->do( "insert into sensor$sensor_nr (monat, tag, zeit, messung)
 values ('$monat', '$tag', '$zeit','$grad_wert')")
   or die "do nicht m�glich:  " . $db->errstr();

}# Final -Filtro Digitemp

# cerrando la base de datos
$db->disconnect;

Una breve explicaci�n del programa:

El programa realmente no hace demasiado, abre la base de datos, lee la salida que recive de digitemp, filtra todo lo que no necesitamos y escribe los datos relevantes dentro del la tabla de la base de datos correcta.

La recogida de datos es realizada con la siguiente entrada en el cron:

 0-59/15 * * * * root /root/bin/digitemp -a | /root/bin/digipipe.pl

Eso es todo para la recolecci�n de datos, ahora el interfaz web.

Perl y CGI

Perl nos ofrece el entorno adecuado para este trabajo.

Lo primero que necesitamos es conocer d�nde est� el directorio donde Apache est� procesando sus programas CGI. Se puede encontrar en el archivo de configuraci�n de Apache. Busca una entrada como �sta <Directory /usr/lib/cgi-bin>.

Antes de comenzar con la salida gr�fica debemos crear un programa qu� nos suministre el �ltimo dato medido.

Estar�a bien si guardaras ese dato en un subdirectorio separado; tambi�n tienes que hacer tu programa ejecutable: chmod 755 nombredelprograma.

Necesitamos limitar la salida al �ltimo dato e introducirlo en un programaPerl-CGI. Esto ser� hecho con la consulta SQL.

#!/usr/bin/perl

use DBI;
use strict;

# Inicializar la base de datos
my $datasource = "dbi:mysql:database=digidb";
my $user = "root";
my $pass = "geheim";

my $db = DBI->connect($datasource, $user, $pass)
  or  "Verbindung zur Datenbank nicht m�glich: " . $DBI::errstr;

# par�metros de trabajo de la base de datos
my $sql;
my $sth;

# Par�metros de trabajo de los sensores
my $temp;
my $zeit;

# Preparar la salida HTML
print "Content-type: text/html\n\n";

# Salida de las medidas de los sensores independientemente
 $sql = "select messung, zeit from sensor$i order by id desc limit 1;";

 $sth = $db->prepare($sql)
   or die "prepare nicht m�glich";
 $sth->execute()
   or die "execute nicht m�glich";
 ($temp, $zeit) = $sth->fetchrow_array();
 $sth->finish();

 print "<p>Temperatur Sensor$i: <b>[$temp]</b>
 $zeit</p>";

}

# Cerramos base de datos
$db->disconnect;

Este no es el ejemplo m�s elegante, deber�a s�lo mostrar qu� f�cil es realizar esta tarea con Perl.

Salida Gr�fica

chart

Ahora trasteemos con la salida gr�fica. El programa (desc�rgalo al final del art�culo) genera curvas gr�ficas, para otros gr�ficos mira los otros m�dulos de GD.

El programa est� utilizando el m�dulo CGI que activa la salida HTML con Perl. Aqu� doy referencias a las numerosas descripciones que hay de esto en Internet.

Volvamos al programa. Abarca una parte principal y dos subprogramas. Una parte es responsable de la consulta SQL, la segunda es responsable de los gr�ficos.

La parte principal s�lo realiza tres consultas y los datos se pasan a los subprogramas.

  1. Generando la escala del eje de las X
  2. Datos del primer sensor (sensor0)
  3. Datos del segundo sensor (sensor1)

Solamente las consultas necesitan variar para generar distinta salida gr�fica.

Consultas SQL

Finalmente quiero mostraros alqunas consultas SQL debido a que son el principal asunto de este ejemplo.

Las �ltimas Cinco Medidas

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

El d�a m�s fr�o del a�o

   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

El d�a m�s caluroso del a�o

   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

Calculando la media (promedio) del d�a

  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)

Conclusi�n

Siempre me sorprendo de qu� f�cil es escribir programas en Perl. Realmente no han sido escrito, pero han sido copiados y las secciones combinadas; de alguna manera todo existe en alguna parte.

Espero que haya podido proporcionaros un peque�o vistazo a los t�picos de Perl, CGI y MySQL.

Descarga

Enlaces / Referencias