Social

En estos días de confinamiento, a parte de trabajar, he tenido tiempo para volver a cacharrear con mi Raspberry. Recordé que tenía guardados algunos sensores de un kit de Arduino, y que con eso y un relé mecánico, lo tenía todo para construir un termostato inteligente para casa.
Si quieres ver como lo hice, ¡sigue leyendo!

Raspberry Smarttemp

Para crear este termostato inteligente, he creado una aplicación web con Python y el framework Flask. La parte frontend se genera en HTML, JQuery, y el framework CSS de Materilize y los datos se almacenan en una base de datos SQLite local.

El resultado es un web app servida por HTTP para controlar el funcionamiento del sensor y la salida GPIO que enciende el relé conectado a la calefacción. Y este es su aspecto y funcionamiento:

Podemos ver:

  • El estado actual del relé
  • La temperatura real actual que recibe el sensor
  • La temperatura objetivo que guarda el usuario
  • Un interruptor general para pagarla completamente
  • Un programador diario por franjas horarias.

He publicado el código en GitHub bajo una licencia de Creative Commons. Todavía está en fase de mejora y a falta de una buena refactorización para considerarla definitiva. Pero se puede usar perfectamente.

¿Qué necesitamos?

  • Una Raspberry con WiFi (a partir de 2B) , y una SD de al menos 8GB con Raspbian instalado.
  • Un sensor de temperatura DHT11 (como este)
  • Un relé mecánico para encender la calefacción como este.
    Aquí puedes ver como funcionan.

GPIO Raspberry

En la imagen siguiente podéis ver un detallado esquema del GPIO de la Raspberry.
En el programa, están prefijados los pines de GPIO de la Raspberry a dos en concreto. Puedes modificarlo en el código si te interesa, en el fichero functions.py, variable pin (sensor temperatura) y led (relé).

Conectando el sensor

Este es el sensor de temperatura DHT11.
Tiene 3 conexiones, la primera para los datos.
En el ejemplo, y como viene preconfigurado, conectaremos el sensor DHT11 al GPIO 4 (pin 7).

La segunda conexión es el positivo VCC y se lo conectaremos a cualquier salida de 5V PWR, por ejemplo, al pin 2.

La tercera, Ground (-) la conectaremos a cualquier GND de la Raspberry, como por ejemplo, el 8.

Conectando el relé / led

Si queréis probar como funciona el termostato antes de instalarlo en casa, podéis conectar un led en vez del relé y hacer pruebas.
Cuando se encienda el led, es como si el relé mecánico cerrara el circuito con la calefacción.
Conectaremos el relé al pin 16 (GPIO 23).
Mira aquí como funciona y se conecta un relé mecánico.

Ejecutando el programa

Una vez tengamos todos los componentes conectados, podemos ejecutar el programa con Docker, o instalando el programa.

Docker

Si queremos ejecutar un contenedor de Docker con la aplicación, solo tenemos que descargar la imagen desde el repositorio de Docker Hub:

sudo docker pull xavigm/raspitemp:latest

Y la ejecutamos:

sudo docker run –privileged –name raspitemp -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -p 80:80 -d –restart=always xavigm/raspitemp

Ahora ya podemos comprobar si el contenedor se está ejecutando y abrir la aplicación en nuestro navegador, con la IP de la Raspberry.

sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed955b4f8e85 raspitemp “/bin/sh -c ‘python3…” 17 minutes ago Up 17 minutes 0.0.0.0:80->80/tcp raspitemp

Instalando la aplicación Python

Accedemos a la Raspberry por SSH, y instalamos Python3 y las librerías necesarias para ejecutar el programa:

sudo apt-get install python3 python3-pip sqlite3
sudo pip3 install waitress Adafruit_DHT flask RPi.GPIO

Y descargamos el programa desde GitHub:

git clone https://github.com/xavigm/raspitemp.git
cd raspitemp

Ahora ya podemos ejecutar el programa con el comando:

sudo python3 main.py  &

Se ejecutará el servidor web y empezará a permitir peticiones por el puerto 80. Puedes comprobarlo abriendo un navegador desde tu móvil u ordenador y abrir la URL con la IP de tu Raspberry, por ejemplo:

http://192.168.1.100

Si quieres que el programa se ejecute al arrancar la Raspberry, puedes copiar el último comando y pegarlo en el fichero /etc/rc.local

¡Ya puedes usar tu termostato inteligente desde cualquier parte de tu casa por Wifi!

Si quieres mejorar el proyecto, eres libre de usar y compartir mi código, ya que está publicado en una licencia CreativeCommons Libre aquí:

https://github.com/xavigm/raspitemp

Si quieres saber como está estructurado, porque te parece un poco caotico, te lo explico:

Ficheros:

main.py
Donde están definidas todas las rutas de la aplicación para renderizar el contenido html, lectura y actualización de valores de la base de datos.
También se ejecuta el thread (definido en las funciones) que comprueba cada 20 segundos los valores para encender o apagar el relé.
functions.py
Donde están las funciones para: leer la temperatura del sensor, comprobar si en el momento actual debe estar encendido el relé según la programación, ejecutar las acciones sobre el GPIO, y guardar el estado general del relé en la bd.
temp.db
Fichero de base de datos Sqlite, con 3 tablas (temp,estado,dias) donde se guardan los estados y la programación diaria.
templates/index.html
El template en html con el frontend de la aplicación, con CSS de w3schools, y Materialize CSS.
static/style.css

Fichero con algunos estilos extras necesarios.
static/rangeslide.js
Codigo en jQuery para hacer funcionar los sliders de rango de tiempo en el frontend, y mostrar los valores guardados en la bd.

Puedes comentar lo que te apetezca en los comentarios.
Si te ha gustado este proyecto, ¡compártelo!
Muchas gracias.


Xavi Gonzalez

Actualmente DevOps Engineer en MotoGP (Dorna Sports). Apasionado de GNU/Linux y del software libre. Me gusta trastear con cualquier gadget, y rodar en moto.

6 comentarios

Jose · 22 octubre, 2020 a las 9:08

Muy buen proyecto, tengo ganas de ponerlo en practica, aunque me interesan 3 sensores, 1 exterior y 2 interiores regulables. Espero ser capaz de completarlo. Gracias a ti tengo una orientación.

Xavi Gonzalez · 28 octubre, 2020 a las 10:34

Hola Jose! Genial, me alegro de que te haya servido de algo mi artículo. Si lo completas, avísame para verlo. Un saludo!

pgrau · 17 noviembre, 2020 a las 1:04

Hola, me sale lo siguiente al querer ocupar docker

The push refers to repository [docker.io/xavigm/raspitemp]
An image does not exist locally with the tag: xavigm/raspitemp

Xavi Gonzalez · 27 diciembre, 2020 a las 22:50

Hola pgrau, disculpa, había un error en el comando (decía push en vez de pull). Ya esta arreglado en el post. Te agradezco que me hayas avisado, ¡un saludo!

Keilor · 18 abril, 2022 a las 16:24

¿Con una Raspberry 1 podría hacer funcionar el sistema? En caso de que no pudiera, tengo una Raspberry 4 que voy a configurar como NAS con Plex, ¿podría usarla contemporáneamente para esto?

Xavi Gonzalez · 7 agosto, 2022 a las 23:01

Hola Keilor, perdona el retraso en la respusta. En principio podrías utilizarlo en cualquier Raspberry, un saludo!

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*