Raspberry Pi – Termòmetre i control web de la casa

En aquest document veurem els passos a seguir per instal·lar sensors de temperatura en una Raspberry Pi, la creació d'una BD per emmagatzemar les temperatures i un script que ens tregui la temperatura de forma periòdica. Crearem un lloc web que ens permetrà obtenir la temperatura actual així com una gràfica amb l'històric de temperatura. Per riure el riure, al lloc web li posarem botons que realitzaran tasques com la d'encendre/apagar un termòstat!

raspberry-DS18B20-bujarra

El primer serà fer-nos amb un sensor de temperatura digital tipus el DS18B20 que a eBay el treiem per 1€ fins i tot submergibles per a l'aquari, a més necessitarem una resistència 4.7k. Podríem fins i tot fer-nos amb un sensor d'humitat també per treure ambdues gràfiques =).

El que farem serà habilitar els mòduls per fer servir els termòmetres, instal·larem MySQL per emmagatzemar en una BD l'històric de les gràfiques de temperatures, crearem un script a Python perquè ens ompli la BD d'informació cada 2 minuts i per acabar instal·larem Apache i crearem un lloc web on podrem veure en temps real les temperatures a més d'una gràfica amb l'historial. I si enllacem amb el document anterior on vèiem com fer servir un relé amb la Raspberry, podrem crear a la mateixa web uns botons que ens permetin encendre o apagar una llum. Comencem habilitant els mòduls:

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

Per quan boti la Raspberry que el guardi:

[sourcecode]sudo vim /etc/modules

w1-gpi
w1-therm[/sourcecode]

I provem amb el següent comandament on veurem la temperatura de cada sensor:

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

 

Instalar MySQL, requisits i crear BD,

Després de deixar els termòmetres ja funcionant, el següent serà instal·lar MySQL i tots els requisits per crear una BD i emmagatzemar les temperatures del meu cas 2 sensors de temperatura (ambient i aquari). La instal·lació de MySQL Server demanarà establir la contrasenya de 'root':

[sourcecode]sudo apt-get instal·lar 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]

Entrem a MySQL i creem una BD anomenada 'Temperatures', una taula anomenada 'temps’ amb 3 camps 'temp1', 'temp2’ i 'created_at':

[sourcecode]mysql -u root -p

mysql> CREATE DATABASE Temperaturas;
mysql> USE Temperatures;
CREATE TABLE temps (
temp1 FLOAT, temp2 FLOAT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);[/sourcecode]

Dimoni per treure temperatura,
Continuem creant un script a Python que llegeixi les temperatures i les emmagatzeme a la BD anterior, per a això podrem utlitzar el següent script on modificarem amb els nostres IDs corresponents dels sensors en 'sensorids', li podem anomenar '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)))

aquari = avgtemperatures[0]
ambient = avgtemperatures[1]

import MySQLdb
db = MySQLdb.connect("localhost","root","CONTRASENA_DE_ROOT","Temperatures")
cursor = db.cursor()
cursor.execute("""INSERT INTO temps (temp1,temp2) VALUES (%s,%s) """,(aquari,ambient))
db.commit()[/sourcecode]

 

Executem l'script un parell de vegades per crear un parell de registres a la BD amb

[sourcecode]python temperatura_demonio.py[/sourcecode]

 

I comprovem senzillament que la BD que té dades amb:

[sourcecode]mysql -u root -p
use Temperatures;
select * from temps;[/sourcecode]

 

Si tot és correcte, programem l'script de Python perquè s'executi cada dos minuts, afegim la següent línia al nostre cron amb 'crontab -e’

[sourcecode]*/2 * * * * /usr/bin/python /home/pi/temperatura_demonio.py[/sourcecode]

 

Instal·lant el servidor web,
Un cop ja tenim un dimoni que ens està capturant la temperatura en una BD, el següent serà posar un lloc web amb Apache i posar un portal xulo amb unes gràfiques de JavaScript. Comencem:

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

Descomprimim el ZIP a '/var/www/temp/’ i editarem en 'index.php’ totes les dades de connexió correctes, així com realitzarem alguns canvis bàsics, en aquest exemple algunes paraules en alemany que porta.

[sourcecode]$mysqli = new mysqli("HOST", "USER", "PASSWORD", "DATABASE");
Gem laatste 24u –> Mitjana
Sensor Binnen –> Aquari
Sensor Buiten –> Ambient[/sourcecode]

raspberry-domotica-bujarra

I aquest seria l'aspecte de la web un cop reiniciem el servei d'Apache! xulo, ¿no?, accedirem al lloc http://IP_RASPBERRY/temp

 

Afegint botons addicionals al lloc web,

Si al lloc web li volem afegir uns botons per executar qualsevol acció, en aquest exemple posarem un botó per encendre el termòstat que té connectat a l'altre costat del relé (termostato_enciende.sh) & un altre per apagar-lo (termostato_apaga.sh); a més altres dos botons per encendre & apagar la llum del passadís (pasillo_enciende.sh & pasillo_apaga.sh). Al final del fitxer 'index.php', abans de la fi de body hi afegim:

[sourcecode]

<h1>Calefaccó</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>Passadís</h1>
<input type="button" id ="PassadísubmitOn" style ="border:1px solid #000; font-size:40px;" value ="On" onClick="PasillorelayOn()"/>
<input type="button" id ="PassadísubmitOff" style ="border:1px solid #000; font-size:40px;" value ="Off" onClick="PasillorelayOff()"/>
</form>

<?php $state = $_GET["total"]; if ($estat == "Termostatoon"){ Exec("/home/pi/termostato_enciende.sh"); } if ($estat == "Termostatooff"){ Exec("/home/pi/termostato_apaga.sh"); } if ($estat == "Pasilloon"){ Exec("/home/pi/pasillo_enciende.sh"); } if ($estat == "Pasillooff"){ Exec("/home/pi/pasillo_apaga.sh"); } ?>[/sourcecode]

 

Y editamos el script de Java que carrega 'script.js’ Afegint les següents modificacions:

[sourcecode]window.onload = funció(){
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;
}

funció TermostatorelayOn(){
ocult = document.getElementById("total");
hidden.value = "Termostatoon";
formulari = document.getElementById("relé");
form.method = "OBTENIR";
form.action = "index.php";
formulari.enviar();
}
funció TermostatorelayOff(){
ocult = document.getElementById("total");
hidden.value = "Termostatooff";
formulari = document.getElementById("relé");
form.method = "OBTENIR";
form.action = "index.php";
formulari.enviar();
}
function PasillorelayOn(){
ocult = document.getElementById("total");
hidden.value = "Pasilloon";
formulari = document.getElementById("relé");
form.method = "OBTENIR";
form.action = "index.php";
formulari.enviar();
}
function PasillorelayOff(){
ocult = document.getElementById("total");
hidden.value = "Pasillooff";
formulari = document.getElementById("relé");
form.method = "OBTENIR";
form.action = "index.php";
formulari.enviar();
}[/sourcecode]

raspberry-domotica-01-bujarra

I aquest seria el resultat del lloc web des d'un iPad on veurem d'una banda la temperatura actual d'aquests dos sensors, recordar que s'hi poden afegir més, o usar un sensor d' humitat, etc.… I a la part inferior podrem posar botons tan senzills com aquests per poder apagar o encendre un relé i obrir o tancar un circuit elèctric! O el que se'ns ocorri, vagi… per connectar-nos des de fora (internet) a aquest lloc web de casa nostra, podrem utilitzar serveis gratuïts tipus DynDNS o NO-IP per saber en tot moment la IP pública que tinguem a més de configurar una VPN per a l'accés segur. Així des de qualsevol lloc podrem encendre el termòstat abans d'arribar a casa, o qualsevol altra necessitat que tinguem, com una alarma amb una càmera…

Posts recomanats

Autor

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, no dubtis a contactar amb mi, us intentareu ajudar sempre que pugui, compartir és viure ;) . Gaudir dels documents!!!