Costruisci un termostato domestico con un Raspberry Pi
Il progetto ThermOS è una risposta ai numerosi svantaggi dei termostati intelligenti disponibili in commercio.
Mia moglie ed io ci siamo trasferiti in una nuova casa nell'ottobre 2020. Non appena ha iniziato a fare freddo, ci siamo resi conto di alcuni difetti del vecchio sistema di riscaldamento della casa (inclusa una zona di riscaldamento sempre accesa). Avevamo i termostati Nest nella nostra casa precedente e la configurazione attuale non era altrettanto conveniente. Nella nostra casa ci sono più termostati e alcuni avevano orari di riscaldamento programmati, altri avevano orari diversi, altri ancora non ne avevano affatto.
Il precedente proprietario della casa ha lasciato degli appunti in cui spiegava come funzionavano alcuni termostati. (Joseph Truncale, CC BY-SA 4.0)
Era ora di cambiare, ma la casa presenta alcuni vincoli:
- E' stato costruito alla fine degli anni '60 con una ristrutturazione avvenuta negli anni '90.
- Il riscaldamento è idronico (battiscopa ad acqua calda).
- Dispone di sei termostati per le sei zone di riscaldamento.
- Ci sono solo due fili che vanno a ciascun termostato per il riscaldamento (rosso e bianco).
Valvole di zona Taco (pronunciato TAY-KO) nella fornace. (Joseph Truncale, CC BY-SA 4.0)
Comprare o costruire?
Volevo un controllo del termostato "intelligente" per tutte le zone termiche (orari, automazioni, casa/fuori, ecc.). Avevo diverse opzioni se volevo comprare qualcosa dallo scaffale, ma tutte presentavano degli svantaggi:
Opzione 1: un nido o un ecobee
- È costoso: nessun termostato intelligente può gestire più zone, quindi ne avrei bisogno di uno per ciascuna zona (~ $200 * 6=$1.200).
- È difficile: dovrei ricollegare il cavo del termostato per ottenere il famigerato cavo C, che consente l'alimentazione continua al termostato. I cavi sono lunghi da 20 a 100 piedi ciascuno, inseriti nel muro, e potrebbero essere fissati con punti metallici ai montanti.
Opzione 2: un termostato alimentato a batteria come il termostato Sensi WiFi
- Le batterie durano solo un mese o due.
- Non è compatibile con HomeKit in modalità solo batteria.
Opzione 3: un termostato commerciale standard, ma ne esiste solo uno (più o meno): TrueZONE di Honeywell
- È vecchio e scarsamente supportato (è stato rilasciato nel 2008).
- È costoso: più di $300 solo per il controller e per far funzionare un'app scadente è necessario un gateway RedLINK.
E il vincitore è…
Opzione 4: costruisci il mio!
Ho deciso di creare il mio termostato intelligente multizona, che ho chiamato ThermOS.
- È centralizzato presso la fornace (è necessario un dispositivo, non sei).
- Utilizza i cavi del termostato a parete esistente.
- È compatibile con HomeKit, completo di automazione, programmazione, casa/fuori, ecc.
- Edddd è... divertente? Sì, divertente... credo.
L'hardware ThermoOS
Sapevo che volevo usare un Raspberry Pi. Dato che sono diventati così economici, ho deciso di utilizzare un Raspberry Pi 4 Modello B da 2 GB. Sono sicuro che potrei cavarmela con un Raspberry Pi Zero W, ma sarà per una revisione futura.
Ecco un elenco completo delle parti che ho utilizzato:
Name | Quantity | Price |
---|---|---|
Raspberry Pi 4 Model B 2GB | 1 | $29.99 |
Raspberry Pi 4 official 15W power supply | 1 | $6.99 |
Inland 400 tie-point breadboard | 1 | $2.99 |
Inland 8 channel 5V relay module for Arduino | 1 | $8.99 |
Inland DuPont jumper wire 20cm (3 pack) | 1 | $4.99 |
DS18B20 temperature sensor (genuine) from Mouser.com | 6 | $6.00 |
3-pin screw terminal blocks (40 pack) | 1 | $7.99 |
RPi GPIO terminal block breakout board module for Raspberry Pi | 1 | $17.99 |
Alligator clip test leads (10 pack) | 1 | $5.89 |
Southwire 18/2 thermostat wire (50ft) | 1 | $10.89 |
Shrinkwrap | 1 | $4.99 |
Solderable breadboard (5 pack) | 1 | $11.99 |
PCB mounting brackets (50 pack) | 1 | $7.99 |
Plastic housing/enclosure | 1 | $27.92 |
Ho iniziato a disegnare il diagramma dell'hardware su draw.io e mi sono reso conto che mi mancavano alcune conoscenze cruciali sulla fornace. Ho aperto il pannello laterale e ho trovato il trasformatore riduttore che prende la linea elettrica a 120V e la rende a 24V per l'impianto di riscaldamento. Se il tuo sistema di riscaldamento è simile al mio, vedrai molti ponticelli tra le valvole di zona Taco. Il terminale 3 del Taco è saltato su tutte le mie valvole di zona. Questo perché non importa quante valvole sono accese/aperte: controlla solo la pompa di circolazione. Se una qualsiasi combinazione da una a cinque valvole è aperta, dovrebbe essere accesa; se nessuna valvola è aperta, dovrebbe essere spenta... semplice!
Architettura ThermOS che utilizza una zona. (Joseph Truncale, CC BY-SA 4.0)
Fondamentalmente, un termostato è solo un tipo di interruttore. Una volta che il termistore (sensore di temperatura) all'interno del termostato rileva una temperatura più bassa, l'interruttore si chiude e completa il circuito a 24 V. Invece di avere un termostato in ogni stanza, questo progetto li mantiene tutti proprio accanto al forno in modo che tutte le valvole a sei zone possano essere controllate da un modulo relè utilizzando sei degli otto relè. Il Raspberry Pi funge da cervello del termostato e controlla ciascun relè in modo indipendente.
Impostazione manuale dei relè utilizzando Raspberry Pi e Python. (Joseph Truncale, CC BY-SA 4.0)
Il problema successivo era come ottenere le letture della temperatura da ogni stanza. Potrei avere un sensore di temperatura wireless in ogni stanza in esecuzione su un Arduino o un Raspberry Pi, ma può diventare costoso e complicato. Volevo invece riutilizzare il cavo del termostato esistente nelle pareti, ma esclusivamente per i sensori di temperatura.
Il sensore di temperatura DS18B20 "a 1 filo" sembrava fare al caso nostro:
- Ha una precisione di +/- 0,5°C o 0,9°F.
- Utilizza il protocollo "1 filo" per i dati.
- Ancora più importante, il DS18B20 può utilizzare la modalità "alimentazione parassita" in cui sono necessari solo due cavi per alimentazione e dati. Solo un avvertimento... quasi tutti i DS18B20 in circolazione sono contraffatti. Ne ho acquistati alcuni (sperando che fossero autentici), ma non funzionavano quando provavo a usare il potere parassitario. Poi ne ho acquistati di veri da Mouser.com e hanno funzionato a meraviglia!
Tre DS18B20 collegati utilizzando alimentazione parassita sullo stesso bus GPIO. (Joseph Truncale, CC BY-SA 4.0)
Partendo da una breadboard e da tutti i componenti localmente, ho iniziato a scrivere il codice per interagire con il tutto. Una volta dimostrato il concetto, ho aggiunto al mix il cavo del termostato a parete esistente. Ho ottenuto letture coerenti con quella configurazione, quindi ho deciso di renderle un po' più rifinite. Con l'aiuto di mio padre, l'autoproclamato saldatore "appena sufficiente", abbiamo saldato i cavi ai terminali a vite a tre pin (per evitare il surriscaldamento del sensore) e quindi collegato il sensore ai terminali. Ora i sensori possono essere fissati con dadi per cavi al cablaggio a parete esistente.
I DS18B20 sono collegati alla vecchia posizione del termostato utilizzando i cavi esistenti. (Joseph Truncale, CC BY-SA 4.0)
Sono ancora in fase di "abbellimento" dei supporti a parete per il sensore di temperatura, ma ho eseguito alcune revisioni della stampa 3D e penso di essere quasi arrivato.
Ho iniziato con un supporto in stile Nest per poi passare a uno stile con montaggio a incasso. (Joseph Truncale, CC BY-SA 4.0)
Il software ThermoOS
Come al solito, scrivere la logica non è stata la parte difficile. Tuttavia, decidere sull'architettura e sul framework dell'applicazione è stato un processo confuso che ha richiesto più giorni. Ho iniziato valutando progetti open source come PiHome, ma si basava su hardware specifico ed era scritto in PHP. Sono un fan di Python e ho deciso di iniziare da zero e scrivere la mia API REST.
Dato che l'integrazione di HomeKit era così importante, ho pensato che alla fine avrei scritto un plugin HomeBridge per integrarla. Non avevo realizzato che esistesse un intero framework Python HomeKit chiamato HAP-Python che implementa il protocollo accessorio. Mi ha aiutato a far funzionare e controllare una prova di concetto tramite l'app Home del mio iPhone in 30 minuti.
Versione iniziale dell'integrazione di Apple HomeKit, con l'aiuto del framework HAP-Python. (Joseph Truncale, CC BY-SA 4.0)
Architettura software ThermOS (Joseph Truncale, CC BY-SA 4.0)
Il resto della logica "temp" è relativamente semplice, ma voglio evidenziare un pezzo che inizialmente mi era sfuggito. Il mio codice era in esecuzione da alcuni giorni e stavo lavorando sull'hardware, quando ho notato che i miei relè si accendevano e si spegnevano ogni pochi secondi. Questo "ciclo breve" non è necessariamente dannoso, ma certamente non è efficiente. Per evitare ciò, ho aggiunto alcune soglie per assicurarmi che il calore si attivi solo quando è +/- 0,5°C.
Ecco la logica della soglia (puoi vedere il debug della papera di gomma nei commenti):
# check that we want heat
if self.target_state.value == 1:
# if heat relay is already on, check if above threshold
# if above, turn off .. if still below keep on
if GPIO.input(self.relay_pin):
if self.current_temp.value - self.target_temp.value >= 0.5:
status = 'HEAT ON - TEMP IS ABOVE TOP THRESHOLD, TURNING OFF'
GPIO.output(self.relay_pin, GPIO.LOW)
else:
status = 'HEAT ON - TEMP IS BELOW TOP THRESHOLD, KEEPING ON'
GPIO.output(self.relay_pin, GPIO.HIGH)
# if heat relay is not already on, check if below threshold
elif not GPIO.input(self.relay_pin):
if self.current_temp.value - self.target_temp.value <= -0.5:
status = 'HEAT OFF - TEMP IS BELOW BOTTOM THRESHOLD, TURNING ON'
GPIO.output(self.relay_pin, GPIO.HIGH)
else:
status = 'HEAT OFF - KEEPING OFF'
La soglia consente periodi di tempo più lunghi in cui il riscaldamento è spento. (Joseph Truncale, CC BY-SA 4.0)
E ho raggiunto il mio obiettivo finale: poter controllare tutto dal mio telefono.
ThermOS come hub HomeKit (Joseph Truncale, CC BY-SA 4.0)
Mettere il mio ThermOS in un cestino per il pranzo
La mia prova di concetto era piuttosto confusa.
ThermOS controlla una singola zona (prima) (Joseph Truncale, CC BY-SA 4.0)
Una volta predisposta la progettazione del software e dell'hardware generale, ho iniziato a capire come assemblare tutti i componenti in una forma più permanente e raffinata. Una delle mie principali preoccupazioni per un'installazione permanente era utilizzare una breadboard con cavi di collegamento DuPont. Ho ordinato alcune breadboard saldabili e una scheda breakout con terminale a vite (grazie @arduima per i pin GPIO del Raspberry Pi).
Ecco come appariva la breadboard saldabile con supporti e custodia in fase di realizzazione.
(Joseph Truncale, CC BY-SA 4.0)
Ed eccola qui, montata nel locale caldaia.
ThermOS montato (Joseph Truncale, CC BY-SA 4.0)
Ora devo solo organizzare ed etichettare i cavi, quindi posso iniziare a scambiare il resto dei termostati con ThermOS. E passerò al mio prossimo progetto: ThermOS per il mio climatizzatore centralizzato.
Questo è apparso originariamente su Medium ed è stato ripubblicato con autorizzazione.