Contrôlez votre climat avec ce tutoriel sur le thermostat Raspberry Pi

Publié: 2022-03-11

La climatisation dans de nombreuses maisons manque de subtilités modernes comme l'automatisation centrale, les thermostats programmables, les capteurs multiples ou le contrôle Wi-Fi. Mais la technologie de climatisation plus ancienne est toujours fiable, donc dans de nombreux cas, il est peu probable qu'elle soit mise à niveau bientôt.

Cependant, cela oblige les utilisateurs à interrompre fréquemment leur travail ou leur sommeil pour allumer ou éteindre un climatiseur. C'est particulièrement vrai dans les maisons aux plans serrés, comme la mienne :

Un plan d'étage avec une unité de climatisation en haut, à droite du centre. Sa sortie doit arrondir deux angles pour atteindre la plupart des pièces, y compris la chambre en bas à gauche.
Mon plan d'étage peu orthodoxe fait du refroidissement avec une seule unité de climatisation intégrée à la fenêtre un défi. Il n'y a pas de ligne de vue directe pour la télécommande depuis la chambre et pas de chemin direct pour que l'air frais atteigne toutes les pièces.

Les maisons américaines ont généralement la climatisation centrale, mais ce n'est pas le cas dans le monde. Ne pas avoir de climatisation centrale limite les options d'automatisation, ce qui rend plus difficile l'obtention de la même température dans toute la maison. En particulier, il est difficile d'éviter les fluctuations de température qui peuvent nécessiter une intervention manuelle pour y remédier.

En tant qu'ingénieur et passionné de l'Internet des objets (IoT), j'ai vu une opportunité de faire quelques choses utiles à la fois :

  • Contribuez à économiser l'énergie en améliorant l'efficacité de mon unité de climatisation autonome
  • Rendre ma maison plus confortable grâce à l'automatisation et à l'intégration de Google Home
  • Personnalisez ma solution exactement comme je le voulais, au lieu de me limiter aux options disponibles dans le commerce
  • Parfaire certaines de mes compétences professionnelles, en utilisant du matériel éprouvé

Mon climatiseur est un appareil basique avec une simple télécommande infrarouge. Je connaissais des appareils permettant d'utiliser des unités de climatisation avec des systèmes de maison intelligente, tels que Sensibo ou Tado. Au lieu de cela, j'ai adopté une approche de bricolage et créé un thermostat Raspberry Pi, permettant un contrôle plus sophistiqué basé sur l'entrée du capteur de différentes pièces.

Matériel de thermostat Raspberry Pi

J'utilisais déjà plusieurs Raspberry Pi Zero W, couplés à des modules de capteurs DHT22, pour surveiller la température et l'humidité dans différentes pièces. En raison du plan d'étage segmenté, j'ai installé les capteurs pour surveiller la chaleur qu'il faisait dans différentes parties de ma maison.

J'ai également un système de surveillance à domicile (non requis pour ce projet) sur un PC Windows 10 avec WSL 2. Je voulais intégrer les lectures des capteurs dans les vidéos de surveillance, sous forme de superposition de texte sur le flux vidéo.

Câblage du capteur

Les capteurs étaient simples à câbler, n'ayant que trois connexions :

La première connexion est "VCC du capteur à PIN1 - 3v3", la seconde est "DONNEES du capteur à PIN7 - GPIO4", et la troisième est "GND du capteur à PIN9 - GND".
Un schéma de câblage du module DHT22, montrant les broches utilisées pour le connecter au Raspberry Pi.

J'ai utilisé Raspberry Pi OS Lite, installé Python 3 avec PiP et la bibliothèque Adafruit_DHT pour Python afin de lire les données du capteur. Il est techniquement obsolète mais plus simple à installer et à utiliser. De plus, cela nécessite moins de ressources pour notre cas d'utilisation.

Je voulais également avoir un journal de toutes les lectures, j'ai donc utilisé un serveur tiers, ThingSpeak, pour héberger mes données et les servir via des appels API. C'est relativement simple, et comme je n'avais pas besoin de lectures en temps réel, j'ai choisi d'envoyer des données toutes les cinq minutes.

 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)

Sur mon PC de surveillance dédié, exécutant WSL 2, j'ai configuré un script PHP qui récupère les données de ThingSpeak, les formate et les écrit dans un simple fichier .txt . Ce fichier .txt est nécessaire pour que mon logiciel de surveillance le superpose au flux vidéo.

Parce que j'avais déjà une certaine automatisation dans la maison, y compris des ampoules intelligentes et plusieurs routines dans Google Home, il s'ensuivait que j'utiliserais les données du capteur comme thermostat intelligent dans Google Home. Mon plan était de créer une routine Google Home qui allumerait ou éteindrait automatiquement la climatisation en fonction de la température ambiante, sans intervention de l'utilisateur.

Une photographie d'un appareil noir en forme de rondelle.
La télécommande intelligente Wi-Fi PNI SafeHome PT11IR.

Des solutions tout-en-un plus chères comme celles de Sensibo et Tado nécessitent moins de configuration technique, mais pour une fraction du coût, le PNI SafeHome PT11IR m'a permis d'utiliser mon téléphone pour contrôler n'importe quel nombre d'appareils infrarouges à sa portée. L'application de contrôle, Tuya, s'intègre à Google Home.

Surmonter les problèmes d'intégration de Google Home

Avec un climatiseur intelligent et des données de capteur disponibles, j'ai essayé de faire reconnaître le Raspberry comme thermostat dans Google Home, mais en vain. J'ai pu envoyer les données du capteur à Google IoT Cloud et à son service Pub/Sub, mais il n'y avait aucun moyen de les envoyer à Google Home pour créer une routine basée sur ces données.

Après avoir réfléchi à cela pendant quelques jours, j'ai pensé à une nouvelle approche. Et si je n'avais pas besoin d'envoyer les données à Google Home ? Et si je pouvais vérifier les données localement et envoyer une commande à Google Home pour allumer ou éteindre le climatiseur ? J'ai testé les commandes vocales avec succès, donc cette approche semblait prometteuse.

Une recherche rapide a révélé Assistant Relay, un système alimenté par Node.js qui permet à un utilisateur d'envoyer des commandes à Google Assistant, permettant à l'utilisateur de lier n'importe quoi à Google Assistant tant qu'il sait quoi faire avec l'entrée qu'il reçoit.

Mieux encore, avec Assistant Relay, je pouvais mettre fin aux commandes de mon Assistant Google en envoyant simplement des requêtes POST à ​​l'appareil exécutant le serveur Node.js (dans ce cas, mon Raspberry Pi Zero W) avec certains paramètres requis. C'est ça. Le script est bien documenté donc je n'entrerai pas dans les détails ici.

Étant donné que les données du capteur étaient déjà lues sur le PC de surveillance, j'ai pensé que je pouvais intégrer la requête dans le script PHP pour garder les choses au même endroit.

Étant donné que vous n'avez probablement pas besoin du fichier .txt , vous pouvez simplifier le processus en lisant directement les données du capteur et en envoyant des commandes basées sur ces données au service Google Assistant, via Assistant Relay. Tout cela peut être fait à partir d'un seul appareil Raspberry Pi, sans avoir besoin de matériel supplémentaire. Cependant, comme j'avais déjà terminé la moitié du travail, il était logique d'utiliser ce que j'avais. Les deux scripts de cet article peuvent être utilisés sur une seule machine ; de plus, le script PHP peut être réécrit en Python, si nécessaire.

Définition des conditions et automatisation du fonctionnement

Je voulais que le cycle d'alimentation automatique ne se produise que pendant la nuit, j'ai donc défini les heures pour lesquelles je voulais automatiser le fonctionnement - 22 h 00 à 7 h 00 - et définir la température préférée. Identifier les intervalles de température corrects - pour obtenir une plage confortable sans raccourcir la durée de vie de l'unité de climatisation en cyclant trop souvent sa puissance - a nécessité quelques essais pour bien faire les choses.

Le script PHP qui a créé la superposition des données du capteur a été configuré pour s'exécuter toutes les cinq minutes via une tâche cron, donc les seules choses que j'y ai ajoutées étaient les conditions et la requête POST.

Cependant, cela a créé un problème. Si les conditions étaient remplies, le script enverrait une commande "allumer" toutes les cinq minutes, même si la climatisation était déjà allumée. Cela a provoqué un bip gênant de l'appareil, même sur la commande "éteindre". Pour résoudre ce problème, j'avais besoin d'un moyen de lire l'état actuel de l'unité.

L'élégance n'était pas une priorité, j'ai donc créé un fichier JSON contenant un tableau. Chaque fois que les commandes "activer" ou "désactiver" se terminent avec succès, le script ajoute alors le dernier état à ce tableau. Cette redondance résolue; cependant, des journées particulièrement chaudes ou un chauffage excessif pendant l'hiver pourraient faire en sorte que les conditions soient à nouveau réunies. J'ai décidé qu'une commande manuelle suffirait dans ces situations. Je laisserai l'ajout d'un retour avant l'extrait de commutateur à cette fin comme exercice pour le lecteur :

 <?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]; }

Cela a fonctionné mais pas du premier coup. J'ai dû comprendre les choses en cours de route et les ajuster au besoin. J'espère que, grâce à mon expérience, vous n'aurez pas besoin d'en faire autant pour bien faire les choses du premier coup.

La valeur d'un contrôleur de thermostat Raspberry Pi

J'étais motivé pour automatiser ma climatisation parce que l'aménagement non conventionnel de ma maison entraînait parfois des températures très différentes dans différentes pièces. Mais l'automatisation du chauffage et de la climatisation présente des avantages même pour ceux qui ne sont pas confrontés à ce problème particulier.

Partout dans le monde, les gens vivent dans des climats différents et paient différents prix pour l'énergie (et différents tarifs à différents moments de la journée), de sorte que même de modestes améliorations de l'efficacité énergétique peuvent rendre l'automatisation intéressante dans certaines régions.

De plus, à mesure que de plus en plus de maisons deviennent automatisées, il y a lieu d'explorer le potentiel d'automatisation des anciens appareils et appareils gourmands en énergie tels que les climatiseurs, les radiateurs électriques et les chauffe-eau. Étant donné que ces appareils sont généralement encombrants, difficiles à installer et coûteux à mettre à niveau, de nombreuses personnes seront obligées de les utiliser pendant des années. Rendre ces appareils « stupides » un peu plus intelligents peut non seulement améliorer le confort et l'efficacité énergétique, mais aussi prolonger leur durée de vie.


Lectures complémentaires sur le blog Toptal Engineering :

  • Comment créer un serveur Raspberry Pi pour le développement
  • Comment transformer votre ancien smartphone en télécommande