Controle su clima con este tutorial de termostato Raspberry Pi

Publicado: 2022-03-11

El aire acondicionado en muchos hogares carece de sutilezas modernas como automatización central, termostatos programables, sensores múltiples o control de Wi-Fi. Pero la tecnología de aire acondicionado más antigua sigue siendo confiable, por lo que, en muchos casos, es poco probable que se actualice pronto.

Eso, sin embargo, requiere que los usuarios interrumpan con frecuencia el trabajo o el sueño para encender o apagar el aire acondicionado. Esto es particularmente cierto en casas con diseños ajustados, como el mío:

Un plano de planta con una unidad de aire acondicionado en la parte superior, a la derecha del centro. Su salida tiene que doblar dos esquinas para llegar a la mayoría de las habitaciones, incluido el dormitorio en la parte inferior izquierda.
Mi plano de planta poco ortodoxo hace que la refrigeración con una sola unidad de aire acondicionado en la ventana sea un desafío. No hay una línea de visión directa para el control remoto desde el dormitorio y no hay una ruta directa para que el aire fresco llegue a todas las habitaciones.

Los hogares estadounidenses suelen tener aire acondicionado central, pero este no es el caso a nivel mundial. No tener aire acondicionado central limita las opciones de automatización, lo que hace que sea más difícil lograr la misma temperatura en toda la casa. En particular, hace que sea difícil evitar las fluctuaciones de temperatura que pueden requerir una intervención manual para abordarlas.

Como ingeniero y entusiasta del Internet de las cosas (IoT), vi la oportunidad de hacer algunas cosas útiles a la vez:

  • Ayude a conservar energía mejorando la eficiencia de mi unidad de aire acondicionado independiente
  • Hacer que mi hogar sea más cómodo a través de la automatización y la integración de Google Home
  • Personalizar mi solución exactamente como la quería, en lugar de limitarme a las opciones disponibles comercialmente
  • Poner al día algunas de mis habilidades profesionales, usando hardware probado y probado

Mi acondicionador de aire es un dispositivo básico con un simple control remoto infrarrojo. Conocía dispositivos que permiten que las unidades de aire acondicionado se usen con sistemas domésticos inteligentes, como Sensibo o Tado. En cambio, adopté un enfoque de bricolaje y creé un termostato Raspberry Pi, lo que permitió un control más sofisticado basado en la entrada del sensor de varias habitaciones.

Hardware del termostato Raspberry Pi

Ya estaba usando varias Raspberry Pi Zero W, junto con módulos de sensores DHT22, para monitorear la temperatura y la humedad en diferentes habitaciones. Debido al plano de planta segmentado, instalé los sensores para monitorear qué tan cálido estaba en diferentes partes de mi casa.

También tengo un sistema de vigilancia del hogar (no requerido para este proyecto) en una PC con Windows 10 con WSL 2. Quería integrar las lecturas del sensor en los videos de vigilancia, como una superposición de texto en la transmisión de video.

Cableado del sensor

Los sensores eran fáciles de cablear y tenían solo tres conexiones:

La primera conexión es "VCC del sensor al PIN1 - 3v3", la segunda es "DATOS del sensor al PIN7 - GPIO4" y la tercera es "GND del sensor al PIN9 - GND".
Un diagrama de cableado para el módulo DHT22, que muestra los pines utilizados para conectarlo a la Raspberry Pi.

Usé Raspberry Pi OS Lite, instalé Python 3 con PiP y la biblioteca Adafruit_DHT para que Python leyera los datos del sensor. Es técnicamente obsoleto pero más simple de instalar y usar. Además, requiere menos recursos para nuestro caso de uso.

También quería tener un registro de todas las lecturas, así que utilicé un servidor de terceros, ThingSpeak, para alojar mis datos y servirlos a través de llamadas API. Es relativamente sencillo y, dado que no necesitaba lecturas en tiempo real, opté por enviar datos cada cinco minutos.

 import requests import time import random import Adafruit_DHT KEY = 'api key' def pushData(temp:float, hum:float): '''Takes temp and humidity and pushes to ThingsSpeak''' url = 'https://api.thingspeak.com/update' params = {'api_key': KEY, 'field5': temp, 'field6': hum} res = requests.get(url, params=params) def getData(sensor:int, pin:int): ''' Input DHT sensor type and RPi GPIO pin to collect a sample of data Parameters: sensor: Either 11 or 22, depending on sensor used (DHT11 or DHT22) pin: GPIO pin used (eg 4) ''' try: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) return humidity, temperature except: Exception("Error reading sensor data") return False if __name__ == "__main__": sensor = 22 # Change to 11 if using DHT11 pin = 4 # I used GPIO pin 4 while True: h, t = getData(sensor, pin) pushData(t, h) time.sleep(300)

En mi PC de vigilancia dedicada, que ejecuta WSL 2, configuré un script PHP que obtiene los datos de ThingSpeak, los formatea y los escribe en un archivo .txt simple. Este archivo .txt es necesario para que mi software de vigilancia lo superponga sobre la transmisión de video.

Debido a que ya tenía algo de automatización en la casa, incluidas bombillas inteligentes y varias rutinas en Google Home, se siguió que usaría los datos del sensor como un termostato inteligente en Google Home. Mi plan era crear una rutina de Google Home que encendiera o apagara el aire acondicionado automáticamente según la temperatura ambiente, sin necesidad de intervención del usuario.

Una fotografía de un dispositivo negro en forma de disco.
La unidad de control remoto inteligente PNI SafeHome PT11IR Wi-Fi.

Las soluciones todo en uno más costosas como las de Sensibo y Tado requieren menos configuración técnica, pero por una fracción del costo, el PNI SafeHome PT11IR me permitió usar mi teléfono para controlar cualquier cantidad de dispositivos infrarrojos dentro de su alcance. La aplicación de control, Tuya, se integra con Google Home.

Superar los problemas de integración de Google Home

Con un acondicionador de aire con capacidad inteligente y datos de sensores disponibles, intenté que la Raspberry fuera reconocida como un termostato en Google Home, pero fue en vano. Pude enviar los datos del sensor a Google IoT Cloud y su servicio Pub/Sub, pero no había forma de enviarlos a Google Home para crear una rutina basada en esos datos.

Después de reflexionar sobre esto durante unos días, pensé en un nuevo enfoque. ¿Qué sucede si no necesito enviar los datos a Google Home? ¿Qué pasaría si pudiera verificar los datos localmente y enviar un comando a Google Home para encender o apagar el aire acondicionado? Probé los comandos de voz con éxito, por lo que este enfoque parecía prometedor.

Una búsqueda rápida arrojó Assistant Relay, un sistema impulsado por Node.js que permite a un usuario enviar comandos al Asistente de Google, lo que le permite vincular cualquier cosa al Asistente de Google siempre que sepa qué hacer con la entrada que recibe.

Aún mejor, con Assistant Relay, podía finalizar los comandos a mi Asistente de Google simplemente enviando solicitudes POST al dispositivo que ejecuta el servidor Node.js (en este caso, mi Raspberry Pi Zero W) con algunos parámetros requeridos. Eso es todo. El guión está bien documentado, así que no entraré en muchos detalles aquí.

Dado que los datos del sensor ya se estaban leyendo en la PC de vigilancia, pensé que podía integrar la solicitud en el script PHP para mantener las cosas en un solo lugar.

Dado que es probable que no tenga el requisito del archivo .txt , puede simplificar el proceso leyendo directamente los datos del sensor y emitiendo comandos basados ​​en esos datos al Servicio del Asistente de Google, a través de Assistant Relay. Todo esto se puede hacer desde un único dispositivo Raspberry Pi, sin necesidad de hardware adicional. Sin embargo, como ya había completado la mitad del trabajo, tenía sentido usar lo que tenía. Ambos scripts en este artículo se pueden usar en una sola máquina; además, el script PHP se puede reescribir en Python, si es necesario.

Configuración de condiciones y operación de automatización

Quería que el ciclo de encendido automático ocurriera solo durante la noche, así que definí las horas en las que quería automatizar el funcionamiento (de 10 p. m. a 7 a. m.) y establecí la temperatura preferida. Identificar los intervalos de temperatura correctos, para lograr un rango cómodo sin acortar la vida útil de la unidad de aire acondicionado ciclando su energía con demasiada frecuencia, requirió algunos intentos para hacerlo bien.

El script PHP que creó la superposición de datos del sensor se configuró para ejecutarse cada cinco minutos a través de un trabajo cron, por lo que lo único que le agregué fueron las condiciones y la solicitud POST.

Sin embargo, esto creó un problema. Si se cumplían las condiciones, el script enviaría un comando de "encendido" cada cinco minutos, incluso si el aire acondicionado ya estaba encendido. Esto hizo que la unidad emitiera un pitido molesto, incluso con el comando de "apagar". Para solucionar esto, necesitaba una forma de leer el estado actual de la unidad.

La elegancia no era una prioridad, así que hice un archivo JSON que contenía una matriz. Cada vez que los comandos "encender" o "apagar" se completen con éxito, la secuencia de comandos agregará el último estado a esta matriz. Esto resolvió la redundancia; sin embargo, los días particularmente calurosos o el calor excesivo durante el invierno podrían hacer que las condiciones se vuelvan a cumplir. Decidí que una anulación manual sería suficiente en estas situaciones. Dejaré la adición de un retorno antes del fragmento de cambio con este fin como ejercicio para el lector:

 <?php switch(true) { case $temperature > 27: turnAc('on'); break; case $temperature < 24: turnAc('off'); break; } function turnAc($status) { $command = 'turn on hallway ac'; // hallway ac is the Google Home device name for my AC if ($status == 'off') { $command = 'turn off hallway ac'; } if ($status == 'on' && checkAc() == 'on') { return; } if ($status == 'off' && checkAc() == 'off') { return; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'local assistant server ip', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS =>'{ "command": '.$command.', "converse": false, "user": "designated user" }', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); $obj = null; try { $obj = json_decode($response); } catch (Exception $e) { } if (!$obj || $obj->success != true) { markAc($status == 'on' ? 'off' : 'on'); // if error, mark it as opposite status return; } markAc($status); } function markAc($status) { $file = __DIR__ . "/markAc.json"; $json = json_decode(file_get_contents($file), true); $json[] = array(date('F j, YH:i:s'), $status); $handler = fopen($file, "w") or die("Unable to open file!"); $txt = json_encode($json); fwrite($handler, $txt); fclose($handler); } function checkAc() { $file = __DIR__ . "/markAc.json"; $json = json_decode(file_get_contents($file), true); $end = array_pop($json); return $end[1]; }

Esto funcionó, pero no en el primer intento. Tuve que descubrir cosas en el camino y ajustarlas según fuera necesario. Con suerte, con el beneficio de mi experiencia, no necesitará hacer tanto para hacerlo bien la primera vez.

El valor de un controlador de termostato Raspberry Pi

Estaba motivado para automatizar mi aire acondicionado porque el diseño poco convencional de mi casa a veces resultaba en temperaturas muy diferentes en diferentes habitaciones. Pero la automatización de la calefacción y la refrigeración tiene beneficios incluso para aquellos que no enfrentan este problema en particular.

Las personas de todo el mundo viven en varios climas y pagan diferentes precios por la energía (y diferentes tarifas en diferentes momentos del día), por lo que incluso las mejoras modestas en la eficiencia energética pueden hacer que la automatización valga la pena en ciertas regiones.

Además, a medida que más y más hogares se automatizan, existe una razón para explorar el potencial de la automatización de dispositivos y electrodomésticos más antiguos que consumen mucha energía, como acondicionadores de aire, calentadores eléctricos y calentadores de agua. Debido a que estos dispositivos suelen ser voluminosos, difíciles de instalar y costosos de actualizar, muchas personas se quedarán con ellos en los años venideros. Hacer que estos dispositivos "tontos" sean un poco más inteligentes no solo puede mejorar la comodidad y la eficiencia energética, sino también extender su vida útil.


Lecturas adicionales en el blog de ingeniería de Toptal:

  • Cómo construir un servidor Raspberry Pi para desarrollo
  • Cómo reutilizar su antiguo teléfono inteligente como control remoto