Raspberry Pi – Termómetro y control web de la casa
En este documento veremos los pasos a seguir para instalar sensores de temperatura en una Raspberry Pi, la creación de una BD para almacenar las temperaturas y un script que nos saque la temperatura de forma periódica. Crearemos un sitio web que nos permitirá obtener la temperatura actual así como una gráfica con el histórico de temperatura. Para rizar el rizo, al sitio web le pondremos botones que realizarán tareas como la de encender/apagar un termostato!
Lo primero será hacernos con un sensor de temperatura digital tipo el DS18B20 que en eBay lo sacamos por 1€ incluso sumergibles para el acuario, además necesitaremos una resistencia 4.7k. Podríamos incluso hacernos con un sensor de humedad también para sacar ambas gráficas =).
Lo que haremos será habilitar los módulos para usar los termómetros, instalaremos MySQL para almacenar en una BD el histórico de las gráficas de temperaturas, crearemos un script en Python para que nos llene la BD de información cada 2 minutos y para acabar instalaremos Apache y crearemos un sitio web donde podremos ver en tiempo real las temperaturas además de una gráfica con el historial. Y si enlazamos con el documento anterior donde veíamos como usar un relé con la Raspberry, podremos crear en la misma web unos botones que nos permitan encender o apagar una luz. Empecemos habilitando los módulos:
[sourcecode]sudo modprobe w1-gpio
sudo modprobe w1-therm[/sourcecode]
Para cuando botee la Raspberry que lo guarde:
[sourcecode]sudo vim /etc/modules
w1-gpio
w1-therm[/sourcecode]
Y probamos con el siguiente comando donde veremos la temperatura de cada sensor:
[sourcecode]cat /sys/bus/w1/devices/ID_SENSOR/w1_slave[/sourcecode]
Instalar MySQL, requisitos y crear BD,
Tras dejar los termómetros ya funcionando, lo siguiente será instalar MySQL y todos los requisitos para crear una BD y almacenar las temperaturas de en mi caso 2 sensores de temperatura (ambiente y acuario). La instalación de MySQL Server pedirá establecer la contraseña de ‘root’:
[sourcecode]sudo apt-get install python-pip
apt-get install python-mysqldb
sudo pip install requests
sudo pip install pymysql
sudo apt-get install mysql-server mysql-client php5-mysql[/sourcecode]
Entramos en MySQL y creamos una BD llamada ‘Temperaturas’, una tabla llamada ‘temps’ con 3 campos ‘temp1’, ‘temp2’ y ‘created_at’:
[sourcecode]mysql -u root -p
mysql> CREATE DATABASE Temperaturas;
mysql> USE Temperaturas;
CREATE TABLE temps (
temp1 FLOAT, temp2 FLOAT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);[/sourcecode]
Demonio para sacar temperatura,
Continuamos creando un script en Python que lea las temperaturas y las almacene en la BD anterior, para ello podremos utlizar el siguiente script donde modificaremos con nuestros IDs correspondientes de los sensores en ‘sensorids’, le podemos llamar ‘temperatura_demonio.py’:
[sourcecode]import requests
import hashlib
import time
sensorids = ["28-00000523e071", "28-0000052391f2"]
avgtemperatures = []
for sensor in range(len(sensorids)):
temperatures = []
for polltime in range(0,3):
text = ”;
while text.split("n")[0].find("YES") == -1:
tfile = open("/sys/bus/w1/devices/"+ sensorids[sensor] +"/w1_slave")
text = tfile.read()
tfile.close()
time.sleep(1)
secondline = text.split("n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = float(temperaturedata[2:])
temperatures.append(temperature / 1000)
avgtemperatures.append(sum(temperatures) / float(len(temperatures)))
acuario = avgtemperatures[0]
ambiente = avgtemperatures[1]
import MySQLdb
db = MySQLdb.connect("localhost","root","CONTRASENA_DE_ROOT","Temperaturas")
cursor = db.cursor()
cursor.execute("""INSERT INTO temps (temp1,temp2) VALUES (%s,%s) """,(acuario,ambiente))
db.commit()[/sourcecode]
Ejecutamos el script un par de veces para crear un par de registros en la BD con
[sourcecode]python temperatura_demonio.py[/sourcecode]
Y comprobamos sencillamente que la BD que tiene datos con:
[sourcecode]mysql -u root -p
use Temperaturas;
select * from temps;[/sourcecode]
Si todo es correcto, programamos el script de Python para que se ejecute cada dos minutos, añadimos la siguiente línea en nuestro cron con ‘crontab -e’
[sourcecode]*/2 * * * * /usr/bin/python /home/pi/temperatura_demonio.py[/sourcecode]
Instalando el servidor web,
Una vez que ya tenemos un demonio que nos está capturando la temperatura en una BD, lo siguiente será poner un sitio web con Apache y poner un portal chulo con unas gráficas de JavaScript. Empezamos:
[sourcecode]sudo apt-get install apache2 php5 libapache2-mod-php5
wget http://iada.nl/en/system/files/tempmon_2_0.zip[/sourcecode]
Descomprimimos el ZIP en ‘/var/www/temp/’ y editaremos en ‘index.php’ todos los datos de conexión correctos, así como realizaremos algunos cambios básicos, en este ejemplo algunas palabras en alemán que trae.
[sourcecode]$mysqli = new mysqli("HOST", "USER", "PASSWORD", "DATABASE");
Gem laatste 24u –> Media
Sensor Binnen –> Acuario
Sensor Buiten –> Ambiente[/sourcecode]
Y este sería el aspecto de la web una vez que reiniciemos el servicio de Apache! chulo, ¿no?, accederemos al sitio http://IP_RASPBERRY/temp
Añadiendo botones adicionales al sitio web,
Si al sitio web le queremos añadir unos botones para ejecutar cualquier acción, en este ejemplo pondremos un botón para encender el termostato que tiene conectado al otro lado del relé (termostato_enciende.sh) & otro para apagarlo (termostato_apaga.sh); además otros dos botones para encender & apagar la luz del pasillo (pasillo_enciende.sh & pasillo_apaga.sh). Al final del fichero ‘index.php’, antes del fin de body añadimos:
[sourcecode]
<h1>Calefaccón</h1>
<form id="relay" action="remote_relay.php" method="GET">
<input type="button" id="TermostatosubmitOn" style="border:1px solid #000; font-size:40px;" value="On" onClick="TermostatorelayOn()"/>
<input type="button" id="TermostatosubmitOff" style="border:1px solid #000; font-size:40px;" value="Off" onClick="TermostatorelayOff()"/>
<h1>Pasillo</h1>
<input type="button" id="PasillosubmitOn" style="border:1px solid #000; font-size:40px;" value="On" onClick="PasillorelayOn()"/>
<input type="button" id="PasillosubmitOff" style="border:1px solid #000; font-size:40px;" value="Off" onClick="PasillorelayOff()"/>
</form>
<?php $state = $_GET["total"]; if ($state == "Termostatoon"){ exec("/home/pi/termostato_enciende.sh"); } if ($state == "Termostatooff"){ exec("/home/pi/termostato_apaga.sh"); } if ($state == "Pasilloon"){ exec("/home/pi/pasillo_enciende.sh"); } if ($state == "Pasillooff"){ exec("/home/pi/pasillo_apaga.sh"); } ?>[/sourcecode]
Y editamos el script de Java que carga ‘script.js’ añadiendo las siguientes modificaciones:
[sourcecode]window.onload = function(){
buttonOn = document.getElementById(‘TermostatosubmitOn’);
buttonOn.onClick = TermostatorelayOn;
buttonOff = document.getElementById(‘TermostatosubmitOff’);
buttonOff.onClick = TermostatorelayOff;
buttonOff = document.getElementById(‘PasillosubmitOff’);
buttonOff.onClick = PasillorelayOff;
buttonOff = document.getElementById(‘PasillosubmitOff’);
buttonOff.onClick = PasillorelayOff;
}
function TermostatorelayOn(){
hidden = document.getElementById("total");
hidden.value = "Termostatoon";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}
function TermostatorelayOff(){
hidden = document.getElementById("total");
hidden.value = "Termostatooff";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}
function PasillorelayOn(){
hidden = document.getElementById("total");
hidden.value = "Pasilloon";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}
function PasillorelayOff(){
hidden = document.getElementById("total");
hidden.value = "Pasillooff";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}[/sourcecode]
Y este sería el resultado del sitio web desde un iPad donde veremos por un lado la temperatura actual de esos dos sensores, recordar que se pueden añadir más, o usar un sensor de humedad, etc… Y en la parte inferior podremos poner botones tan sencillos cómo estos para poder apagar o encender un relé y abrir o cerrar un circuito eléctrico! O lo que se nos ocurra, vaya… para conectarnos desde fuera (internet) a este sitio web de nuestra casa, podremos utilizar servicios gratuitos tipo DynDNS o NO-IP para saber en todo momento la IP pública que tengamos además de configurar una VPN para el acceso seguro. Así desde cualquier lugar podremos encender el termostato antes de llegar a casa, o cualquier otra necesidad que tengamos, como una alarma con una cámara…