Domotica: il riscaldamento controllato via web, con Raspberry PI – Parte 2

Il Raspberry PI e il relay mantengono le promesse.

Scendiamo nei dettagli dei due apparati concentrandoci su come domarli. Niente di particolarmente complesso.

Il Raspberry PI è nostro amico sin da subito.

Il relay è un po’ strano per chi non ha mai gestito una comunicazione su porta seriale a bassissimo livello, ma funziona egregiamente con qualche magia del mestiere.

[Continua da http://sergiovaccaro.it/domotica-il-riscaldamento-controllato-via-web-con-raspberry-pi-1/]

La consegna

Entrambi gli strumenti sono arrivati dopo quattro o cinque giorni dal giorno dell’ordine.

La confezione del Raspberry PI è divertente, ricorda una scatola di medicine e promette di far bene alla salute.

La scatola del Raspberry PI
La scatola del Raspberry PI

 Il Raspberry PI

Non c’è molto da dire sul Raspberry PI. Non solo perché è stato già scritto moltissimo, ma anche perché non riserva sorprese rispetto a quanto desideriamo.

Il Raspberry PI è un computer a tutti gli effetti, si accende inserendo l’alimentazione e si spegne con un normale shutdown -h now. È quasi stupefacente collegare un oggetto da 3 pollici e mezzo al nostro gigantesco monitor da 27 pollici. O forse no, non ce ne stupiamo più.

Nel mio carrello ho inserito anche la scheda Wifi – che funziona perfettamente, il box trasparente e una scheda SD con sistema già installato, l’offerta era conveniente e non volevo perder tempo con l’installazione.

Prima esecuzione

Il primo avvio va eseguito con monitor e tastiera. Non parte un sistema operativo, ma uno strumento di installazione.

Non me l’aspettavo, ma nella scheda ci sono sei sistemi operativi.

Sistemi operativi del Raspberry PI
Sistemi operativi del Raspberry PI

Ho scelto Raspbian, derivato dalla robusta, ben nota, vecchia, cara, accogliente Debian. Anche Arch e RiscOS PI sono stati una tentazione, così come forte è stata la tentazione di metterci la solita Gentoo. Ma ho scelto di non distrarmi e andare sulla strada più diffusa e sperimentata: Raspbian, appunto.

Raspbian

L’installazione va da sé.
Conviene tenere il monitor e la tastiera finché non abbiamo configurato la rete e le utenze.

Per tutto il resto, è Debian e giochiamo in casa.
Potrei chiudere qua, visto che di guide Debian ce ne sono un mucchio e non sono stati necessari accorgimenti speciali o inaspettati.

A mia memoria, invece, faccio un rapidissimo riepilogo di come ho impugnato il sistema. Chi conosce Debian salterà al paragrafo successivo.

La filosofia di Raspbian è quella di Ubuntu: niente password di root ma un utente chiamato pi, con password – ma guarda – raspberry.  Io ho scelto le solite manovre e ho preso la root con:

 

Poi ho trafficato con  apt per installare i tool necessari o preferiti, ho fatto un giretto per la /etc, ho configurato le reti, ho creato utenze e gruppi.

Ho installato vim, gkrellmd, rdiff-backup, syslog-ng (solo perché lo conosco meglio),  vixie-cronapache2, php5. E ho trovato utile per comprendere e domare la porta seriale che verrà emulata dal relay, installare setserial.

Per la wlan0 ho dovuto trafficare con wpa_supplicant. Poiché la configurazione non mi entra mai in testa, la riporto qua:

 

La configurazione della rete che ho adottato è “quasi” quella di default, con l’aggiunta – appunto – della gestione di wpa_supplicant :

 

Poi ho fatto fuori quell’utenza standard e ho preparato le mie preferite: una che si chiama relay, per le operazioni automatiche, e una che si chiama sergio, per me.

Infine ho organizzato l’avvio dei servizi secondo il mio piacere.

In tutti questi modi, ho cucinato quanto basta perché il sistema fosse mio e pronto per andare nella caldaia.

Il relay

Con il relay c’è stato da divertirsi di più.

I connettori

Vale la pena di guardare meglio la fotografia per comprendere NC, C e NO.

KMtronic USB Relay Controller
KMtronic USB Relay Controller

L’idea è che uno dei i due poli del circuito da governare deve essere connesso a C, mentre l’altro a NC o NO, a seconda della preferenza.

NC, infatti, sta per Normally Connected, mentre NO sta per Normally Open.

Quindi, a relay off, e quindi anche quando non è governato, il connettore NC è connesso a C, mentre NO è staccato. Quando il relay è on, con la spia status accesa, NO è connesso a C e NC è disconnesso.

Ho scelto di connettere il cavo del termostato a NC, per rendere reversibile l’installazione. Se il Raspberry PI è spento, la caldaia sarà governata dal solito termostato.

Questa scelta, quindi, produrrà qualche leggera emicrania: quando il relay è acceso, cioè è in stato 1, il connettore NC è aperto e la caldaia è spenta, cioè è in stato 0. E viceversa.

Dunque so come collegare in serie il relay (inizialmente spento, 0) e il termostato.

Non resta che governarlo.

Il programma di KMTronic

KMTronic fornisce un programma per controllare l’USB relay, con codice sorgente.

È scritto in C, funziona a dovere ed è perfettamente descritto nella pagina di presentazione. Ha il solo difetto di rispondere un po’ lentamente quando si interroga il relay per conoscerne lo stato.

Chi ha in mente usi manuali si troverà perfettamente a proprio agio.

Prima che KMTronic pubblicasse quel programma, però, avevo già adottato una soluzione tutta bash. Inaspettatamente, i miei script ai miei occhi funzionano meglio, perché pensando al web ho bisogno di più velocità.

Perciò propongo ancora la mia soluzione. Un po’ per le prestazioni e un po’ perché è stato un esercizio interessante.
Esercizio o no, io continuo ad usarla.

Alternativa: governare il relay con bash

Quando ho scoperto il programma KMTronic mi sono sentito sollevato, con bash mi ero avventurato in un territorio a me sconosciuto e ho pensato di affidarmi subito al loro software.

Ma poi me ne sono pentito.

Quando si richiede lo stato del relay, il programma ha due difetti: emette un output troppo verboso e risponde lentamente.

Quello che io desidero infatti è un programma che risponda con un semplice 1  o 0, il più rapidamente possibile, pensato per essere usato come API verso il relay da parte di altri programmi.

Modificare il programma in C per alleggerire l’output è abbastanza semplice, mentre non mi è chiara la ragione del ritardo, probabilmente nascosta agli occhi della mia conoscenza scolastica del C all’interno di  termios.h.

Insomma, per farla breve, preferisco ancora i miei strumenti bash.

Comunicare con la porta

Per iniziare, la porta seriale emulata dal relay è /dev/ttyUSB0 (o un numero diverso).

Possiamo inviare segnali a quella porta con un semplice echo:

 

L’opzione -e è utile, anzi fondamentale, perché abilita l’interpretazione dell’escaping fatto con il backslash \. Ci servirà.

Naturalmente il relay non reagirà al saluto.

Analogamente, possiamo leggere le comunicazioni in arrivo dal relay con un semplice cat:

 

In realtà eseguendo questo comando non  succede un bel niente e dovremo chiudere con un CTRL+C. Certo, il motivo è che il relay non ha nulla da dire, proprio ora. Ma il motivo è anche che il relay non invia né segnali di EOL e nemmeno di EOF per indicare che il suo eventuale messaggio è finito. Dovremo lavorarci su.

I segnali del relay

Per iniziare, è necessario configurare la comunicazione.

Essendo molto semplice, il relay non invia segnali di EOL e questo non è il comportamento di default delle comunicazioni seriali. Dovremo perciò informare il kernel di questa caratteristica. Inoltre dovremo impostare una velocità di comunicazione che KMTronic stabilisce a 9600 baude. Entrambe le istruzioni si eseguono con un unico comando.

 

A questo punto il relay comprenderà tre messaggi:

 

Questo segnale accende il relay e la spia rossa si illumina. Poiché stato usato il connettore NC, questo vuol dire che la caldaia viene spenta.

 

Questo segnale spegne il relay e la spia rossa si attenua.  Poiché è stato usato il connettore NC, questo vuol dire che la caldaia viene accesa.

Fin qui è facile. Più complicato è richiedere lo stato, anzi è complicato leggere la risposta.

 

Questo segnale invia al relay una richiesta di stato. La risposta, completamente asincrona, è un messaggio del tipo:

 

Con xx  uguale a 00  (relay spento, caldaia accesa) o 01  (relay acceso, caldaia spenta).

Il lavoraccio è leggere quella risposta.

La risposta, infatti, viene inviata in modo completamente asincrono. Se eseguissimo la richiesta di stato e subito dopo leggessimo la risposta quasi certamente non troveremmo un bel niente. La risposta arriva infatti troppo in fretta.

L’unica soluzione è usare due programmi: uno in background che legge la risposta e che viene eseguito per primo, mettendosi in attesa; uno in foreground che invia la richiesta subito dopo, mentre quello in background è pronto a ricevere.

Il risultato è il seguente:

 

La lettura della risposta è il processo che viene inviato in background alla riga 20. È una concatenazione di roba. La richiesta, successiva, è la riga 26.

Il problema che ho dovuto affrontare era che il programma in background deve restituire la risposta a quello in foreground.

Per questo, ho usato una named pipe. (Linux Journal ha un ottimo articolo sulle named pipe.)

Una named pipe è un file speciale che si comporta proprio come la più nota pipe anonima ( |), solo che è posizionata nel filesystem e consente di far comunicare tra loro processi dalla vita separata.

Dunque, prima si crea la named pipe, poi si manda in background il processo di lettura, che scriverà quello che cattura nella named pipe, poi si invia la richiesta di stato e poi si legge il contenuto “depositato” nella named pipe. Voilà.

Due parole possono essere spese sulla riga che legge la risposta.

/usr/bin/timeout provvede semplicemente a fermare l’esecuzione dopo due secondi in caso di fallimento (vedremo perché potrebbe fallire).

/usr/bin/xxd legge i primi tre caratteri ( -l3) dal file /dev/ttyUSB0 e converte da esadecimale a decimale. Non solo esegue la conversione, insomma, ma si occupa da solo del fatto che il relay non invia segnali di fine messaggio (il messaggio è di tre caratteri, tutto qui).

La lettura viene inviata a /usr/bin/cut, che si occupa di leggere l’unica cifra che ci interessa, che sarà 0 (relay spento, caldaia accesa) o 1 (relay acceso, caldaia spenta).

Il risultato viene scritto nella pipe, in attesa che qualcuno lo legga. Poi il processo va in background.

A parte un piccolo sleep  per dare il tempo al processi di lettura di avviarsi, il resto è abbastanza elementare.

Questo programma è molto più veloce di quello fornito da KMTronic. Ha l’unico difetto di non essere del tutto affidabile. In condizioni sfortunate , infatti, la creazione della named pipe e l’avvio del processo di lettura in background potrebbero richiedere un tempo apprezzabile, tanto che la risposta del relay potrebbe arrivare troppo presto. In quel caso il programma va in timeout dopo due secondi senza emettere output.
Ecco perché quello sleep. Ho fissato il valore a un decimo di secondo a tentativi e per me così funziona.

Preferisco questa soluzione. Se questo script deve essere usato come API è più efficiente. Un eventuale fallimento può essere gestito dal programma che invoca l’API.

Il montaggio nella caldaia

Non è andato bene come speravo. Sia il Raspberry PI e sia il relay sono molto piccoli, ma il groviglio di cavi e l’alimentatore mini USB hanno il loro ingombro. Piuttosto che tagliuzzare i cavi e schiacciare tutto, ho preferito aggiungere una scatola da esterno per collegamenti elettrici, comprata in un qualsiasi negozio di ferramenta e fissata con il nastro biadesivo che avevo a casa.

IMG_20131019_102928

L’unico elemento libero è il Raspberry PI nella caldaia: si vedono le lucine rosse. Il resto è nella scatola.

Il grosso cavo arancione porta l’elettricità dalla caldaia all’alimentatore micro USB del Raspberry PI, con una banale derivazione. Uno dei due cavi neri più grandi porta l’alimentazione al Raspberry PI. L’altro cavo nero collega la porta USB del Raspberry PI al relay e i due cavi più sottili, marrone e azzurro, sono in serie con il circuito del termostato.

Questa mattina all’alba c’è stata una violenta bufera, il vento sollevava molta acqua fino al soffitto (la porta finestra era completamente bagnata) e il client GKrellM installato nel mio desktop mi informava che il Raspberry PI era perfettamente allegro e funzionante 🙂

Ecco perché mi son deciso a scrivere questa seconda parte.

 

[Continua da http://sergiovaccaro.it/domotica-il-riscaldamento-controllato-via-web-con-raspberry-pi-1/]

6 Comments

 Add your comment
  1. Ciao, complimenti per la guida. Ne ho trovate diverse ma questa è quella più “passo-passo” di quelle che ho letto. Attendo con ansia la terza parte, dove parli dell’interfaccia web. Grazie, Claudio

  2. E anche del sensore di temperatura!! Claudio

  3. Ciao Sergio!
    intanto complimenti per il “I NEVER FINISH ANYTH”! mi hai fatto sorridere e mi trovo molto in sintonia con questa cosa ahime!

    Passiamo all’ RPI… ho anche io intenzione di integrare un controllo sul mio impianto di riscaldamento; a dire il vero sto puntando a fare qualcosa sul ricambio aria ma la domanda è un altra. Come mai usi la connessione USB per il relè e non la GPIO? Per la facilità di programmazione?

    ciao e grazie

  4. Complimenti attendiamo la terza parte per gestire il sensore di temperatura 🙂

  5. Ciao, complimenti per il lavoro, molto interessante e grande fonte di ispirazione la guida scritta in maniera molto comprensibile. A mio modesto avviso una schedina elettronica come quella Raspberry deve essere installata nel contenitore stagno che hai posto sul fianco della caldaia, al riparo da agenti atmosferici. Hai tagliato i gommini passacavo in modo eccessivo, questi devono serrarsi attorno ai cavi in maniera che lo scambio con l’esterno sia assolutamente limitato. Una domanda: perchè usi un Relé USB se è possibile comandare un relé da 2€ (di quelli per Arduino, per capirci) collegandolo direttamente al bus del Raspberry? Ciao ed in bocca al lupo.

    • Il lavoro elettrico non è di mia competenza: ben vengano le critiche!
      Si tratta, comunque, di un terrazzino molto profondo, dove l’acqua di fatto non arriva.
      Ho scelto quel relay, però, proprio perché è già “boxed” e con un connettore stabile. Non volevo una soluzione con basetta e cavi fissati alla meglio, perché non mi sentivo sicuro.
      Anche se non ho mai fatto l’interfaccia web (lavoro in bash, anche dal telefono), così allestito funziona da due anni senza manutenzione.

Leave a Comment

Your email address will not be published.

1 Trackback

  1. Domotica: il riscaldamento controllato via web, con Raspberry PI - Parte 1 | Sergio VaccaroSergio Vaccaro (Pingback)
Analisi degli accessi a www.istat.it
×
', 'auto'); ga('require', 'displayfeatures'); ga('set', 'forceSSL', true); ga('send', 'pageview');