Framboesa 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 criação 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á obter 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 acuário, además necesitaremos una resistencia 4.7k. Podríamos mesmo fazernos com um sensor de humedad também para sacar ambas gráficas =).
Lo que haremos será habilitar los módulos para usar los termómetros, instalaremos MySQL para guardar en una BD el histórico de las gráficas de temperaturas, crearemos um script em Python para que nos llene la BD de informação cada 2 minutos y para acabar instalaremos Apache e criaremos um sitio web onde podremos ver en tiempo real las temperaturas además de una gráfica con el historial. E se ligarmos com o documento anterior onde vimos como usar um relé com a Raspberry, poderemos criar no mesmo site uns botões que nos permitam ligar ou desligar uma luz. Comecemos por habilitar os módulos:
[Código-fonte]sudo modprobe w1-gpio
sudo modprobe w1-therm[/Código-fonte]
Para que, ao arrancar a Raspberry, ele o guarde:
[Código-fonte]sudo vim /etc/modules
w1-gpio
w1-therm[/Código-fonte]
E testamos com o seguinte comando, onde veremos a temperatura de cada sensor:
[Código-fonte]cat /sys/bus/w1/devices/ID_SENSOR/w1_slave[/Código-fonte]
Instalar MySQL, requisitos e criar BD,
Depois de deixar os termómetros a funcionar, o seguinte será instalar o MySQL e todos os requisitos para criar uma BD e armazenar as temperaturas de, no meu caso 2 sensores de temperatura (ambiente e aquário). La instalación de MySQL Server pedirá establecer la contraseña de 'root':
[Código-fonte]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[/Código-fonte]
Entramos en MySQL y creamos una BD llamada 'Temperaturas', una tabla llamada 'temps'’ com 3 campos 'temp1', 'temp2’ y 'created_at':
[Código-fonte]mysql -u raiz -p
Mysql> CREATE DATABASE Temperaturas;
Mysql> CREATE TABLE Temperatures;
CREATE TABLE Temperatures (
temp1 FLOAT, temp2 FLOAT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);[/Código-fonte]
Demónio para sacar temperatura,
Continuamos creating 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 os nossos IDs correspondentes de los sensores en 'sensorids', le podemos llamar 'temperatura_demonio.py':
[Código-fonte]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(temperatura / 1000)
avgtemperatures.append(sum(temperatures) / flutuar(len(temperatures)))
acuario = avgtemperatures[0]
ambiente = avgtemperatures[1]
importar MySQLdb
db = MySQLdb.connect("localhost","root","CONTRASENA_DE_ROOT","Temperaturas")
cursor = db.cursor()
cursor.execute("""INSERT INTO temps (temp1,temp2) VALORES (%s,%s) """,(Aquário,ambiente))
db.commit()[/Código-fonte]
Ejecutamos el script un par de veces para crear un par de registros en la BD con
[Código-fonte]python temperatura_demonio.py[/Código-fonte]
Y comprobamos sencillamente que la BD que tiene datos con:
[Código-fonte]mysql -u raiz -p
use Temperaturas;
select * from temps;[/Código-fonte]
Se tudo estiver correto, programamos el script de Python para que se ejecute cada dos minutos, añadimos la siguiente línea en nuestro cron con ‘crontab -e’
[Código-fonte]*/2 * * * * /usr/bin/python /home/pi/temperatura_demonio.py[/Código-fonte]
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. Começou:
[Código-fonte]sudo apt-get install apache2 php5 libapache2-mod-php5
WGET HTTP://iada.nl/en/system/files/tempmon_2_0.zip[/Código-fonte]
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.
[Código-fonte]$mysqli = new mysqli("HOST", "USER", "PASSWORD", "DATABASE");
Gem laatste 24u –> Media
Sensor Binnen –> Acuario
Sensor Buiten –> Ambiente[/Código-fonte]
Y este sería el aspecto de la web una vez que reiniciemos el servicio de Apache! chulo, Não?, 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:
[Código-fonte]
<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"]; se ($state == "Termostatoon"){ exec("/home/pi/termostato_enciende.sh"); } se ($state == "Termostatooff"){ exec("/home/pi/termostato_apaga.sh"); } se ($state == "Pasilloon"){ exec("/home/pi/pasillo_enciende.sh"); } se ($state == "Pasillooff"){ exec("/home/pi/pasillo_apaga.sh"); } ?>[/Código-fonte]
Y editamos el script de Java que carga ‘script.js’ añadiendo las siguientes modificaciones:
[Código-fonte]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();
}[/Código-fonte]
E este seria o resultado do site a partir de um iPad onde veremos, por um lado, a temperatura atual desses dois sensores, lembrar que se podem adicionar mais, ou usar um sensor de humidade, etc… E na parte inferior poderemos colocar botões tão simples como estes para poder desligar ou ligar um relé e abrir ou fechar um circuito elétrico! Ou o que nos ocorrer, ir… para nos conectarmos a partir de fora (internet) a este site da nossa casa, podremos utilizar serviços 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 qualquer lugar podremos encender el termostato antes de chegar a casa, o cualquier otra necesidad que tengamos, como una alarma con una câmara…











































