Controlla il tuo clima con questo tutorial sul termostato Raspberry Pi

Pubblicato: 2022-03-11

L'aria condizionata in molte case manca di sottigliezze moderne come l'automazione centralizzata, i termostati programmabili, i sensori multipli o il controllo Wi-Fi. Ma la vecchia tecnologia di condizionamento dell'aria è ancora affidabile, quindi in molti casi è improbabile che venga aggiornata presto.

Ciò, tuttavia, richiede agli utenti di interrompere frequentemente il lavoro o dormire per accendere o spegnere un condizionatore d'aria. Questo è particolarmente vero nelle case con layout stretti, come la mia:

Una pianta con un condizionatore in alto, a destra del centro. La sua uscita deve arrotondare due angoli per raggiungere la maggior parte delle stanze, inclusa la camera da letto in basso a sinistra.
La mia pianta non ortodossa rende il raffreddamento con un singolo condizionatore d'aria in-finestra una sfida. Non c'è una linea visiva diretta per il controllo remoto dalla camera da letto e nessun percorso diretto per l'aria fresca per raggiungere tutte le stanze.

Le case degli Stati Uniti hanno comunemente l'aria condizionata centralizzata, ma questo non è il caso a livello globale. La mancanza di un AC centralizzato limita le opzioni di automazione, rendendo più difficile raggiungere la stessa temperatura in tutta la casa. In particolare, rende difficile evitare sbalzi di temperatura che potrebbero richiedere un intervento manuale per essere affrontati.

In qualità di ingegnere e appassionato di Internet of Things (IoT), ho visto l'opportunità di fare alcune cose utili contemporaneamente:

  • Contribuisci a risparmiare energia migliorando l'efficienza del mio condizionatore d'aria autonomo
  • Rendi la mia casa più confortevole grazie all'automazione e all'integrazione di Google Home
  • Personalizza la mia soluzione esattamente come la desideravo, invece di limitarti alle opzioni disponibili in commercio
  • Rispolvera alcune delle mie capacità professionali, utilizzando hardware collaudato

Il mio condizionatore d'aria è un dispositivo base con un semplice telecomando a infrarossi. Conoscevo i dispositivi che consentono di utilizzare i condizionatori d'aria con sistemi domestici intelligenti, come Sensibo o Tado. Invece, ho adottato un approccio fai-da-te e ho creato un termostato Raspberry Pi, consentendo un controllo più sofisticato basato sull'input del sensore da varie stanze.

Hardware del termostato Raspberry Pi

Stavo già utilizzando diversi Raspberry Pi Zero W, accoppiati con moduli sensore DHT22, per monitorare la temperatura e l'umidità in stanze diverse. A causa della pianta segmentata, ho installato i sensori per monitorare quanto faceva caldo in diverse parti della mia casa.

Ho anche un sistema di sorveglianza domestica (non richiesto per questo progetto) su un PC Windows 10 con WSL 2. Volevo integrare le letture dei sensori nei video di sorveglianza, come testo in sovrimpressione sul feed video.

Cablaggio del sensore

I sensori erano semplici da cablare, avendo solo tre connessioni:

La prima connessione è "VCC dal sensore al PIN1 - 3v3", la seconda è "DATI dal sensore al PIN7 - GPIO4" e la terza è "GND dal sensore al PIN9 - GND".
Uno schema elettrico per il modulo DHT22, che mostra i pin utilizzati per collegarlo al Raspberry Pi.

Ho usato Raspberry Pi OS Lite, installando Python 3 con PiP e la libreria Adafruit_DHT per Python per leggere i dati del sensore. È tecnicamente deprecato ma più semplice da installare e utilizzare. Inoltre, richiede meno risorse per il nostro caso d'uso.

Volevo anche avere un registro di tutte le letture, quindi ho utilizzato un server di terze parti, ThingSpeak, per ospitare i miei dati e servirli tramite chiamate API. È relativamente semplice e, poiché non avevo bisogno di letture in tempo reale, ho deciso di inviare i dati ogni cinque minuti.

 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)

Sul mio PC di sorveglianza dedicato, con WSL 2, ho impostato uno script PHP che recupera i dati da ThingSpeak, li formatta e li scrive in un semplice file .txt . Questo file .txt è necessario affinché il mio software di sorveglianza lo sovrapponga al flusso video.

Poiché avevo già un po' di automazione in casa, comprese le lampadine intelligenti e diverse routine in Google Home, ne seguì che avrei utilizzato i dati del sensore come termostato intelligente in Google Home. Il mio piano era creare una routine di Google Home che accendesse o spegnesse automaticamente l'aria condizionata in base alla temperatura ambiente, senza bisogno dell'input dell'utente.

Una fotografia di un dispositivo nero a forma di disco.
Il telecomando intelligente Wi-Fi PNI SafeHome PT11IR.

Le soluzioni all-in-one più costose come quelle di Sensibo e Tado richiedono una configurazione tecnica inferiore, ma per una frazione del costo, PNI SafeHome PT11IR mi ha consentito di utilizzare il mio telefono per controllare un numero qualsiasi di dispositivi a infrarossi all'interno della sua portata. L'app di controllo, Tuya, si integra con Google Home.

Superare i problemi di integrazione di Google Home

Con un condizionatore d'aria intelligente e i dati dei sensori disponibili, ho provato a far riconoscere il Raspberry come termostato in Google Home, ma senza successo. Sono stato in grado di inviare i dati del sensore a Google IoT Cloud e al suo servizio Pub/Sub, ma non c'era modo di inviarli a Google Home per creare una routine basata su quei dati.

Dopo aver riflettuto su questo per alcuni giorni, ho pensato a un nuovo approccio. E se non avessi bisogno di inviare i dati a Google Home? E se potessi controllare i dati in locale e inviare un comando a Google Home per accendere o spegnere il condizionatore d'aria? Ho testato i comandi vocali con successo, quindi questo approccio sembrava promettente.

Una rapida ricerca ha rivelato Assistant Relay, un sistema basato su Node.js che consente a un utente di inviare comandi all'Assistente Google, consentendo all'utente di collegare qualsiasi cosa all'Assistente Google purché sappia cosa fare con l'input che riceve.

Ancora meglio, con Assistant Relay, potrei terminare i comandi al mio Google Assistant semplicemente inviando richieste POST al dispositivo che esegue il server Node.js (in questo caso, il mio Raspberry Pi Zero W) con alcuni parametri richiesti. Questo è tutto. La sceneggiatura è ben documentata, quindi non entrerò nei dettagli qui.

Poiché i dati del sensore erano già stati letti sul PC di sorveglianza, ho pensato di poter integrare la richiesta nello script PHP per mantenere le cose in un posto.

Poiché probabilmente non hai i requisiti per il file .txt , puoi semplificare il processo leggendo direttamente i dati del sensore ed emettendo comandi basati su tali dati al servizio Assistente Google, tramite Assistant Relay. Tutto questo può essere fatto da un singolo dispositivo Raspberry Pi, senza la necessità di hardware aggiuntivo. Tuttavia, poiché avevo già completato metà del lavoro, aveva senso usare quello che avevo. Entrambi gli script in questo articolo possono essere utilizzati su una singola macchina; inoltre, lo script PHP può essere riscritto in Python, se necessario.

Impostazione delle condizioni e automazione del funzionamento

Volevo che il ciclo di accensione automatico avvenisse solo durante la notte, quindi ho definito le ore per le quali volevo automatizzare il funzionamento, dalle 22:00 alle 7:00, e ho impostato la temperatura preferita. L'identificazione degli intervalli di temperatura corretti, per ottenere un intervallo confortevole senza ridurre la durata dell'unità di condizionamento dell'aria eseguendo un ciclo di alimentazione troppo frequente, ha richiesto alcuni tentativi per farlo funzionare correttamente.

Lo script PHP che ha creato la sovrapposizione dei dati del sensore è stato impostato per essere eseguito ogni cinque minuti tramite un processo cron, quindi le uniche cose che ho aggiunto sono state le condizioni e la richiesta POST.

Tuttavia, questo ha creato un problema. Se le condizioni fossero soddisfatte, lo script invierebbe un comando di "accensione" ogni cinque minuti, anche se l'aria condizionata era già accesa. Ciò ha causato un fastidioso segnale acustico dell'unità, anche al comando di "spegnimento". Per risolvere questo problema, avevo bisogno di un modo per leggere lo stato corrente dell'unità.

L'eleganza non era una priorità, quindi ho creato un file JSON contenente un array. Ogni volta che i comandi "accendi" o "disattiva" vengono completati correttamente, lo script aggiunge l'ultimo stato a questo array. Questa ridondanza risolta; tuttavia, giornate particolarmente calde o un riscaldamento eccessivo durante l'inverno potrebbero far tornare le condizioni. Ho deciso che un override manuale sarebbe stato sufficiente in queste situazioni. Lascerò l'aggiunta di un ritorno prima dello snippet di commutazione a tal fine come esercizio per il lettore:

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

Questo ha funzionato ma non al primo tentativo. Ho dovuto capire le cose lungo la strada e modificarle secondo necessità. Spero che, con il beneficio della mia esperienza, non dovrai fare molto per farlo bene la prima volta.

Il valore di un controller termostato Raspberry Pi

Ero motivato ad automatizzare la mia aria condizionata perché la disposizione non convenzionale della mia casa a volte portava a temperature molto diverse in stanze diverse. Ma automatizzare il riscaldamento e il raffrescamento ha vantaggi anche per coloro che non affrontano questo particolare problema.

Le persone in tutto il mondo vivono in climi diversi e pagano prezzi diversi per l'energia (e tariffe diverse in diversi momenti della giornata), quindi anche modesti miglioramenti nell'efficienza energetica possono rendere utile l'automazione in alcune regioni.

Inoltre, poiché sempre più case diventano automatizzate, c'è motivo di esplorare il potenziale dell'automazione di vecchi dispositivi ed elettrodomestici affamati di energia come condizionatori d'aria, stufe elettriche e scaldabagni. Poiché questi dispositivi sono in genere ingombranti, difficili da installare e costosi da aggiornare, molte persone rimarranno bloccati con loro per gli anni a venire. Rendere questi dispositivi "stupidi" un po' più intelligenti non solo può migliorare il comfort e l'efficienza energetica, ma anche allungarne la durata.


Ulteriori letture sul blog di Toptal Engineering:

  • Come creare un server Raspberry Pi per lo sviluppo
  • Come riutilizzare il tuo vecchio smartphone come telecomando