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, webgunean botoiak jarriko dizkiogu, termostato bat pizteko/itzaltzeko lanak egingo dituztenak!

raspberry-DS18B20-bujarra

Lehenik eta behin, DS18B20 motako tenperatura sentsore digital bat eskuratuko dugu; eBay-n 1€-tan aurki dezakegu, akuarioetarako urpekoak ere barne., Gainera, 4,7k erresistentzia bat beharko dugu.. Nahiz eta hezetasun sentsore bat ere eskuratu genezake, bi grafikoak ateratzeko =).

Egin behar duguna moduluak gaitzea izango da termometroak erabiltzeko., MySQL instalatuko dugu tenperatura grafikoen historiako datuak datu-base batean biltegiratzeko., Python-en script bat sortuko dugu datu-basea informazioaz betetzeko 2 minutu bakoitzeko, eta amaitzeko, Apache instalatuko dugu eta webgune bat sortuko dugu non tenperaturak denbora errealean ikus ditzakegun, baita historialarekin grafiko bat ere. Eta, aurreko dokumentuarekin lotzen bagara, non Raspberry batekin rele bat nola erabili ikusten genuen, web berean botoi batzuk sor ditzakegu argi bat pizteko edo itzaltzeko aukera emango diguten. Moduluak gaitzen hasten gara:

[sourcecode]sudo modprobe w1-gpio
sudo modprobe w1-therm[/sourcecode]

Raspberry berrabiarazten denean hori gordetzeko:

[sourcecode]sudo vim /etc/modules

w1-gpio
w1-therm[/sourcecode]

Eta hurrengo komandoarekin probatzen dugu, non sentsore bakoitzaren tenperatura ikusten dugun:

[sourcecode]cat /sys/bus/w1/devices/ID_SENSOR/w1_slave[/sourcecode]

 

MySQL instalatu, eskakizunak eta DB sortu,

Tenperatura-neurgailuak martxan utzi ondoren, hurrengoa MySQL eta DB bat sortzeko eta nire kasuan tenperaturak gordetzeko beharrezko eskakizun guztiak instalatzea izango da 2 tenperatura-sentsoreak (ingurunea eta akuarioa). MySQL Server instalazioak 'root' pasahitza ezartzea eskatuko du:

[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]

MySQL-en sartzen gara eta 'Temperaturas' izeneko BD bat sortzen dugu, 'temps' izeneko taula bat’ con 3 'temp1' eremua, 'temp2'’ eta '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]

Tenperatura ateratzeko demonia,
Python script bat sortzen jarraitzen dugu, tenperaturak irakurtzeko eta aurreko BD-an gordetzeko, Horretarako, hurrengo script hau erabil dezakegu, non 'sensorids'-eko gure sentsoreen IDak aldatuko ditugun, le podemos llamar ‘temperatura_demonio.py’:

[sourcecode]import requests
import hashlib
importatu time

sensorids = ["28-00000523e071", "28-0000052391f2"]
avgtemperatures = []
for sensor in range(luzeera(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(tenperatura. / 1000)

avgtemperatures.append(sum(temperatures) / float(luzeera(temperatures)))

acuario = avgtemperatures[0]
ambiente = avgtemperatures[1]

importatu MySQLdb
db = MySQLdb.connect("localhost","root","CONTRASENA_DE_ROOT","Temperaturas")
cursor = db.cursor()
cursor.execute("""INSERT INTO temps (temp1,temp2) BALIOAK (%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]

 

Dena zuzen badago, 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.phptodos 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]

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:

[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.jsañ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]

raspberry-domotica-01-bujarra

Eta hau izango litzateke iPad-ean webgunearen emaitza, non ikusiko dugun aldetik bi sentsore horien egungo tenperatura, gogoratu gehi daitezkeela gehiago, edo hezetasun-sentsore bat erabili, eta abar… Eta beheko aldean botoi sinpleak jar ditzakegu, hala nola hau, relé bat itzaltzeko edo pizteko eta zirkuitu elektriko bat ireki edo ixteko! Edo etortzen zaigun edozer, vaya… Kanpotik konektatzeko (internet) gure etxeko webgunera, 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…

Izenburuko mezuak

Egilea

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, ez zalantzarik izan nirekin harremanetan jartzeko, ahal duzun guztietan laguntzen saiatuko naiz, partekatu ahal dudan guztietan ;) . Dokumentuez gozatu!!!