You are on page 1of 7

NODEJS

TuR
otarialspberyP
Giraceatlm
r perautradael
CPUconNodsyH
ejg.ihchasrt

Hola! Hoy vengo a ensearos un proyecto en el que estoy trabajando. He llegado al punto en el que
pre ero ensearos cmo hacerlo antes que mostraros el proyecto cuando acabe todo (que tambin
lo har). Hace poco, nuestro compaero AlexCorvis public una entrada sobre Xively y Raspberry
Pi, una manera de ver estadsticas y el estado de nuestra Raspberry Pi en Internet, es decir, el
Internet de las cosas. Esto no vale slo para Raspberry Pi, pero como sabemos que os gusta, lo
aplicamos a ello.

converted by Web2PDFConvert.com

Hace ya varios meses estbamos trabajando en Geeky Theory en un proyecto bastante ms


grande que esto que os voy a ensear ahora. Este tutorial es una mnima parte de lo que tenemos,
pero no se puede documentar todo el cdigo lnea a lnea, como comprenderis.
El objetivo es gra car la temperatura del SoC (System on a Chip) de la Raspberry Pi para poder
verla desde un navegador. Esto lo haremos con node.js y Highcharts.
El resultado debera ser algo parecido a esto:

Voy a contaros mi planteamiento principal para llevar a cabo esto con el menor consumo de
recursos por parte de la Raspberry Pi. En Linux, podemos ver por ejemplo, la temperatura en
miligrados en un archivo haciendo simplemente esto:
1 cat /sys/class/thermal/thermal_zone0/temp

Muy sencillo, no? Pues lo que pens hacer es poner un watchdog que me controlara cundo
cambiaba el chero para que cuando lo hiciese, coger su contenido y meterlo en la gr ca.
Problema: el archivo cambiaba de contenido pero veas sus propiedades y la ltima hora de
modi cacin era la hora en la que haba encendido el ordenador. Cmo puede modi carse un
archivo sin modi carse? An sigo sin entenderlo, as que si algn linuxero experto lo sabe Por
favor que me lo diga!
Bueno, pues viendo el fracaso de esto, fu a lo fcil: cada X tiempo ejecuto un comando para saber
la temperatura y gra co lo que me devuelva. Haciendo esto, la Raspberry Pi funciona bastante
bien. No se calienta ni se queda atascada y va el navegador bastante fluido.
Despus de este rollo, voy a ensearos lo que tenis que hacer para acabar realizando este tutorial:

PiyrRpberasalW
enebdoriversunaraltnsI 1.
Esto lo podis hacer siguiente tutorial: Instalar servidor Web Raspberry Pi
Si no tenis Raspberry Pi pero lo queris hacer en cualquier Linux, podis seguir este: Instalar

converted by Web2PDFConvert.com

servidor Web Linux

PiyrRpberasal npm
eysjnode.araltnsI 2.
Simplemente introduciremos los siguientes comandos:
1 sudo apt-get install nodejs npm

Es lo mismo para cualquier Linux. Recordad que al final la Rasberry Pi con Raspbian es a grandes
rasgos un Debian.

oectoypr delapetcaralem
earosCr3.
1 mkdir /var/www/Raspberry-Pi-Status

Navegamos hacia ella:


1 cd /var/www/Raspberry-Pi-Status

oi.SetockaraltnsI 4.
Ejecutamos el siguiente comando:
1 npm install socket.io

dorivers elarecutejqueovchiar elam


Cros5.
Lo llamaremos server.js y estar dentro de la carpeta js, ya que est programado en Javascript.
Hay que ser ordenado con los ficheros de cdigo!
1 mkdir js

1 cd js

1 nano server.js

No explicar el cdigo paso a paso porque est visto en los tutoriales de node.js de Geeky Theory.
Voy diciendo lo que hago en los comentarios:
1 /**
2 * Autor: Mario Prez Esteso
3 * Web: geekytheory.com
4 */
5
6 var app = require('http').createServer(handler),
7
io = require('socket.io').listen(app),
8 fs = require('fs'),
converted by Web2PDFConvert.com

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

sys = require('util'),
exec = require('child_process').exec,
child;
//Escuchamos en el puerto 8000
app.listen(8000);
//Si todo va bien al abrir el navegador, cargaremos el archivo index.html
function handler(req, res) {
fs.readFile(__dirname+'/../index.html', function(err, data) {
if (err) {
//Si hay error, mandaremos un mensaje de error 500
console.log(err);
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
//Cuando abramos el navegador estableceremos una conexin con socket.io.
//Cada 5 segundos mandaremos a la grfica un nuevo valor.
io.sockets.on('connection', function(socket) {
setInterval(function(){
child = exec("cat /sys/class/thermal/thermal_zone0/temp", function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
} else {
//Es necesario mandar el tiempo (eje X) y un valor de temperatura (eje Y).
var date = new Date().getTime();
var temp = parseFloat(stdout)/1000;
socket.emit('temperatureUpdate', date, temp);
}
});}, 5000);
});

Ya tenemos creada la parte de servidor. Node.js mola mucho!

eenti cl elarecutejqueovchiar elam


Cros6.
Ahora vamos a mostrar en nuestro navegador los datos que recibimos de la Raspberry Pi. Para ello,
utilizaremos Highcharts, como ya he mencionado anteriormente. Como estbamos en la carpeta js
dentro de la ruta absoluta /var/www/Raspberry-Pi-Status/js, navegamos a la carpeta status.
Introducimos el siguiente comando:
1 cd ..

o tambin podemos ejecutar el siguiente, da igual:


1 cd /var/www/Raspberry-Pi-Status

Ahora creamos el archivo index.html:


1 nano index.html

Su contenido es el siguiente. Tened en cuenta que la IP de mi Raspberry Pi es la 192.168.1.9.


Vosotros poned la vuestra:
1
2
3
4
5
6
7
8

<!DOCTYPE html>
<!-Autor: Mario Prez Esteso <mario@geekytheory.com>
Web: geekytheory.com
-->
<html>
<head>
<meta charset="utf-8" name="viewport" content="width=device-width" />
converted by Web2PDFConvert.com

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

<title>
Raspberry Pi Status
</title>
<!-- Importo el mdulo socket.io que tengo en el proyecto -->
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<!-- Importo el archivo Javascript de Highcharts directamente desde su servidor -->
<script src="http://code.highcharts.com/highcharts.js"></script>
</head>
<body>
<!-- Creo el div donde tendr la grfica. Le digo que ocupe todo el ancho
de la pantalla y 400px de alto -->
<div id="chart" style="width:100%; height:400px;"></div>
<!-- Comienza el Javascript -->
<script>
// Creo un WebSocket. Poned la IP de vuestra Raspberry Pi!
var socket = io.connect('http://192.168.1.9:8000');
// Creo un nuevo objeto 'Chart'
var chart;
chart = new Highcharts.Chart({
chart: {
renderTo: 'chart',
defaultSeriesType: 'spline',
events: {
load: function() {
// Cada vez que reciba un valor desde el socket, lo meto en la grfica
socket.on('temperatureUpdate', function (time, data) {
var series = chart.series[0];
series.addPoint([time, data]);
});
}
}
},
rangeSelector : {
selected : 100
},
title: {
text: 'CPU Temperature Raspberry Pi'
},
xAxis: {
type: 'datetime',
tickPixelInterval: 150,
maxZoom: 20 * 1000
},
yAxis: {
minPadding: 0.2,
maxPadding: 0.2,
title: {
text: 'Temperature C',
margin: 80
}
},
series: [{
name: 'Temperature',
data: []
}]
});
</script>
</body>
</html>

Finalmente, queda ejecutar el cdigo.

gocdidelnecuiEj7.
Ejecutamos el siguiente comando:
1 nodejs js/server.js

y tras esto abrimos el navegador en la direccin de la Raspberry Pi: http://192.168.1.9:8000 en mi


caso.

converted by Web2PDFConvert.com

Como siempre, podis ver todo el cdigo en GitHub. Haced fork, starreadlo, Lo que queris!

A vuestro servicio Un saludo!


Fuente imagen cabecera: readwrite.com

HIGHCHARTS

JAVASCRIPT

JS

NODE

TEMPERATURA

NODEJS

RASPBERRY PI

TEMPERATURE

NODEJS

COMPARTIR:

converted by Web2PDFConvert.com

AUTORES

Mario Prez Esteso


Ingeniero de Telecomunicacin especializado en telemtica. Apasionado de la programacin
y del conocimiento libre.

converted by Web2PDFConvert.com

You might also like