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!

raspberry-DS18B20-bujarra

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:

sudo modprobe w1-gpio
sudo modprobe w1-therm

Para cuando botee la Raspberry que lo guarde:

sudo vim /etc/modules

w1-gpio
w1-therm

Y probamos con el siguiente comando donde veremos la temperatura de cada sensor:

cat /sys/bus/w1/devices/<ID_SENSOR>/w1_slave

 

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’:

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

Entramos en MySQL y creamos una BD llamada ‘Temperaturas’, una tabla llamada ‘temps’ con 3 campos ‘temp1’, ‘temp2’ y ‘created_at’:

mysql -u root -p

mysql> CREATE DATABASE Temperaturas;
mysql> USE Temperaturas;
CREATE TABLE temps (
temp1 FLOAT, temp2 FLOAT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

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’:

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

 

Ejecutamos el script un par de veces para crear un par de registros en la BD con

python temperatura_demonio.py

 

Y comprobamos sencillamente que la BD que tiene datos con:

mysql -u root -p
use Temperaturas;
select * from temps;

 

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’

*/2 * * * * /usr/bin/python /home/pi/temperatura_demonio.py

 

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:

sudo apt-get install apache2 php5 libapache2-mod-php5
wget http://iada.nl/en/system/files/tempmon_2_0.zip

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.

$mysqli = new mysqli("HOST", "USER", "PASSWORD", "DATABASE");
Gem laatste 24u --> Media
Sensor Binnen --> Acuario
Sensor Buiten --> Ambiente

raspberry-domotica-bujarra

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:


<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"); } ?>

 

Y editamos el script de Java que carga ‘script.js’ añadiendo las siguientes modificaciones:

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

raspberry-domotica-01-bujarra

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…

Héctor Herrero

Autor del blog Bujarra.com
Cualquier necesidad que tengas, no dudes en contactar conmigo, os intentare ayudar siempre que pueda, compartir es vivir 😉 . Disfrutar de los documentos!!!

Últimos Posts de: Héctor Herrero (ver todos)