Controlați-vă clima cu acest tutorial pentru termostat Raspberry Pi

Publicat: 2022-03-11

Aerul condiționat din multe locuințe nu are facilități moderne, cum ar fi automatizarea centrală, termostate programabile, senzori multipli sau controlul Wi-Fi. Dar tehnologia mai veche de aer condiționat este încă fiabilă, așa că, în multe cazuri, este puțin probabil să fie actualizată în curând.

Acest lucru, totuși, impune utilizatorilor să întrerupă frecvent munca sau somnul pentru a porni sau opri un aparat de aer condiționat. Acest lucru este valabil mai ales în casele cu structuri strânse, cum ar fi a mea:

Un plan de etaj cu o unitate de aer condiționat în partea de sus, în dreapta centrului. Ieșirea sa trebuie să rotunjească două colțuri pentru a ajunge la majoritatea camerelor, inclusiv dormitorul din stânga jos.
Planul meu neortodox face ca răcirea cu o singură unitate de aer condiționat în fereastră să fie o provocare. Nu există o linie directă de vedere pentru controlul de la distanță din dormitor și nici o cale directă pentru ca aerul rece să ajungă în toate camerele.

Casele din SUA au de obicei aer condiționat central, dar acest lucru nu este cazul la nivel global. Neavând AC centralizat limitează opțiunile de automatizare, ceea ce face mai dificilă atingerea aceleiași temperaturi în toată casa. În special, este dificilă evitarea fluctuațiilor de temperatură care ar putea necesita intervenție manuală pentru a le rezolva.

Ca inginer și pasionat de Internet of Things (IoT), am văzut o oportunitate de a face câteva lucruri utile simultan:

  • Ajutați la conservarea energiei prin îmbunătățirea eficienței unității mele de aer condiționat autonome
  • Faceți-mi casa mai confortabilă prin automatizare și integrarea Google Home
  • Personalizează-mi soluția exact așa cum mi-am dorit-o, în loc să fii limitat la opțiunile disponibile comercial
  • Îmbunătățiți unele dintre abilitățile mele profesionale, folosind hardware-ul testat

Aparatul meu de aer condiționat este un dispozitiv de bază cu o simplă telecomandă cu infraroșu. Eram conștient de dispozitive care permit utilizarea unităților de aer condiționat cu sisteme de casă inteligente, cum ar fi Sensibo sau Tado. În schimb, am adoptat o abordare bricolaj și am creat un termostat Raspberry Pi, permițând un control mai sofisticat bazat pe intrarea senzorului din diferite camere.

Hardware pentru termostat Raspberry Pi

Folosisem deja mai multe Raspberry Pi Zero W-uri, cuplate cu module senzori DHT22, pentru a monitoriza temperatura și umiditatea din diferite încăperi. Datorită planului de etaj segmentat, am instalat senzorii pentru a monitoriza cât de cald era în diferite părți ale casei mele.

Am și un sistem de supraveghere acasă (nu este necesar pentru acest proiect) pe un PC Windows 10 cu WSL 2. Am vrut să integrez citirile senzorilor în videoclipurile de supraveghere, ca o suprapunere de text pe fluxul video.

Cablajul senzorului

Senzorii erau ușor de conectat, având doar trei conexiuni:

Prima conexiune este „VCC de la senzor la PIN1 - 3v3”, a doua este „DATE de la senzor la PIN7 - GPIO4”, iar a treia este „GND de la senzor la PIN9 - GND”.
O diagramă de cablare pentru modulul DHT22, care arată pinii utilizați pentru a-l conecta la Raspberry Pi.

Am folosit Raspberry Pi OS Lite, instalând Python 3 cu PiP și biblioteca Adafruit_DHT pentru ca Python să citească datele senzorului. Este depreciat din punct de vedere tehnic, dar mai simplu de instalat și utilizat. În plus, necesită mai puține resurse pentru cazul nostru de utilizare.

De asemenea, am vrut să am un jurnal al tuturor citirilor, așa că am folosit un server terță parte, ThingSpeak, pentru a-mi găzdui datele și a le servi prin apeluri API. Este relativ simplu și, din moment ce nu aveam nevoie de citiri în timp real, am optat să trimit date la fiecare cinci minute.

 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)

Pe computerul meu dedicat de supraveghere, care rulează WSL 2, am configurat un script PHP care preia datele de la ThingSpeak, le formatează și le scrie într-un fișier simplu .txt . Acest fișier .txt este necesar pentru ca software-ul meu de supraveghere să-l suprapună peste fluxul video.

Pentru că aveam deja ceva automatizări în casă, inclusiv becuri inteligente și mai multe rutine în Google Home, a rezultat că voi folosi datele senzorului ca termostat inteligent în Google Home. Planul meu era să creez o rutină Google Home care să pornească sau să oprească automat aerul condiționat în funcție de temperatura camerei, fără a fi nevoie de intervenția utilizatorului.

O fotografie a unui dispozitiv negru în formă de puc.
Unitatea de telecomandă inteligentă Wi-Fi PNI SafeHome PT11IR.

Soluțiile all-in-one mai scumpe, cum ar fi cele de la Sensibo și Tado, necesită mai puțină configurare tehnică, dar pentru o fracțiune din cost, PNI SafeHome PT11IR mi-a permis să-mi folosesc telefonul pentru a controla orice număr de dispozitive cu infraroșu în raza sa. Aplicația de control, Tuya, se integrează cu Google Home.

Depășirea problemelor de integrare Google Home

Având la dispoziție un aparat de aer condiționat inteligent și datele senzorului, am încercat să recunosc Raspberry ca termostat în Google Home, dar fără rezultat. Am putut trimite datele senzorului către Google IoT Cloud și serviciul său Pub/Sub, dar nu a existat nicio modalitate de a le trimite la Google Home pentru a crea o rutină bazată pe acele date.

După ce m-am gândit câteva zile la asta, m-am gândit la o nouă abordare. Ce se întâmplă dacă nu trebuie să trimit datele către Google Home? Ce se întâmplă dacă aș putea să verific datele local și să trimit o comandă către Google Home pentru a porni sau opri aparatul de aer condiționat? Am testat cu succes comenzile vocale, așa că această abordare mi s-a părut promițătoare.

O căutare rapidă a găsit Assistant Relay, un sistem alimentat de Node.js care permite unui utilizator să trimită comenzi către Google Assistant, permițându-i utilizatorului să leagă orice de Google Assistant atâta timp cât știe ce să facă cu intrarea pe care o primește.

Și mai bine, cu Assistant Relay, aș putea încheia comenzile către Asistentul meu Google prin simpla trimitere a solicitărilor POST către dispozitivul care rulează serverul Node.js (în acest caz, Raspberry Pi Zero W al meu) cu unii parametri necesari. Asta e. Scriptul este bine documentat, așa că nu voi intra în multe detalii aici.

Deoarece datele senzorului erau deja citite pe computerul de supraveghere, m-am gândit că aș putea integra solicitarea în scriptul PHP pentru a păstra lucrurile într-un singur loc.

Deoarece probabil că nu aveți cerința fișierului .txt , puteți simplifica procesul citind direct datele senzorului și emitând comenzi bazate pe acele date către Serviciul Asistent Google, prin Releu Asistent. Toate acestea se pot face de pe un singur dispozitiv Raspberry Pi, fără a fi nevoie de hardware suplimentar. Cu toate acestea, deoarece deja terminasem jumătate din muncă, era logic să folosesc ceea ce aveam. Ambele scripturi din acest articol pot fi utilizate pe o singură mașină; în plus, scriptul PHP poate fi rescris în Python, dacă este necesar.

Stabilirea condițiilor și automatizarea funcționării

Am vrut ca ciclul automat de alimentare să aibă loc numai pe timp de noapte, așa că am definit orele pentru care doream să automatizez funcționarea — 22:00 până la 7:00 — și am stabilit temperatura preferată. Identificarea intervalelor corecte de temperatură - pentru a obține o gamă confortabilă fără a scurta durata de viață a unității de aer condiționat prin recircularea prea des a puterii - a necesitat câteva încercări pentru a o face corect.

Scriptul PHP care a creat suprapunerea datelor senzorului a fost configurat să ruleze la fiecare cinci minute printr-un job cron, așa că singurele lucruri pe care le-am adăugat la acesta au fost condițiile și solicitarea POST.

Cu toate acestea, acest lucru a creat o problemă. Dacă condițiile ar fi îndeplinite, scriptul ar trimite o comandă de „pornire” la fiecare cinci minute, chiar dacă aerul condiționat era deja pornit. Acest lucru a făcut ca unitatea să sune enervant, chiar și la comanda „oprire”. Pentru a remedia acest lucru, aveam nevoie de o modalitate de a citi starea curentă a unității.

Eleganța nu a fost o prioritate, așa că am făcut un fișier JSON care conține o matrice. Ori de câte ori comenzile „pornire” sau „oprire” s-au finalizat cu succes, scriptul ar adăuga apoi ultima stare acestei matrice. Acest lucru a rezolvat redundanța; totuși, zilele deosebit de caniculare sau încălzirea excesivă în timpul iernii ar putea face ca condițiile să fie din nou îndeplinite. Am decis că o anulare manuală ar fi suficientă în aceste situații. Voi lăsa adăugarea unei retur înainte de fragmentul de comutare în acest scop ca un exercițiu pentru cititor:

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

Acest lucru a funcționat, dar nu la prima încercare. A trebuit să-mi dau seama de lucruri pe parcurs și să le modific după cum era necesar. Sper că, cu beneficiul experienței mele, nu va trebui să faceți atât de mult pentru a face bine de prima dată.

Valoarea unui controler de termostat Raspberry Pi

Am fost motivat să-mi automatizez aerul condiționat, deoarece aspectul neconvențional al casei mele ducea uneori la temperaturi foarte diferite în camere diferite. Dar automatizarea încălzirii și răcirii are beneficii chiar și pentru cei care nu se confruntă cu această problemă specială.

Oamenii din întreaga lume trăiesc în diferite climate și plătesc prețuri diferite pentru energie (și tarife diferite în diferite momente ale zilei), așa că chiar și îmbunătățirile modeste ale eficienței energetice pot face ca automatizarea să merite în anumite regiuni.

În plus, pe măsură ce din ce în ce mai multe case devin automatizate, există motive pentru a explora potențialul automatizării dispozitivelor și aparatelor mai vechi care consumă energie, cum ar fi aparatele de aer condiționat, încălzitoarele electrice și încălzitoarele de apă. Deoarece aceste dispozitive sunt de obicei voluminoase, dificil de instalat și costisitoare de actualizat, mulți oameni vor rămâne blocați cu ele în anii următori. Făcând aceste dispozitive „proaste” puțin mai inteligente, nu numai că poate îmbunătăți confortul și eficiența energetică, ci și le poate extinde durata de viață.


Citiți suplimentare pe blogul Toptal Engineering:

  • Cum să construiți un server Raspberry Pi pentru dezvoltare
  • Cum să reutilizați vechiul smartphone ca telecomandă