domenica 30 novembre 2014

Remote heater - HW

This is an English translation of the original Italian post

I am doing that as some friends told me they would have been interested in the project but they cannot simply read Italian.

In this post I describe how I have built a simple remote control mechanism for my home heating system.

My objective here is to create a simple system which is capable to answer two simple questions:

  1. how do I switch on/off my heating system when I am out of home?
  2. how do I program my home heating system in a flexible way?

Currently the home heating system is controlled by a normal on the wall thermostat

That one doesn't give me the required flexibility necessary to satisfy above item #1 and #2.

One day I got in my hands a  raspberry pi model B  and then I have asked myself: why not replacing the on the wall thermostat with the raspberry?

This was the starting point of my small home project.

The first step has been to get the approval from my boss (wife??? ) :). She has immediately added a third requirement:

3. the on the wall thermostat should (must) always be working and should not be replaced by the raspberry one.

Well, now all the requirements are clear so I can start the implementation of the project.

Initial Circuit

The current circuit of the home heater is the following:

Final Circuit

In order to be compliant with requirement #3 I have modified the initial circuit in the following way:

This way I have realized a simple logical OR between the raspberry pi and the on the wall thermostat. This satisfies all the 3 requirements:

  1. through the raspebbry I can switch the relay and thus switching on/off the heating system from a remote location
  2. I can program the raspberry in a way that it switch on/off the heating system in a flexible way 
  3. in case the Rasperry will not be working (network down, hw failure, ...)  I can still operate the heating system from the legacy on the wall thermostat

Assembly of the project

In order to build and assemble this simple home project I have used the following components:

Step 1: Prepating the Junction Box
I have positioned the rapsberry in a corner of the junction box. Raspberry will be fixed in that position through a screw

As my junction box is not large enough to fully host the raspberry, I have signed with a pencil the place on the junction box in which to create a slot to allow the insertion of the power cable and the SD card.

As you can see the slots have been created with an electrical drill. I am not very proud of this part of the project :) . If you have better idea and better tools to create the slots let me know.

Step 2: Fixing the junction box to the wall

I have drilled a hole in the junction box so later I can apply a nut and bolt screw in order to fix and hold the raspberry pi.

Later I have applied some glue to the junction box and to the wall. This is how the junction box is hold on the wall. I have used glue to avoid drilling the wall.
Obviously this is my preference and you can select a different way to hold the box on the wall.

Step 3: Raspberry Wiring

The wiring is pretty straightforward. It is only needed:

  • VCC +5V
  • GND
  • 1x GPIO (#15) but you can use any other available GPIO on your board. I have used 15 just for wiring issues.

More in detail I have wired the raspberry in this way:

  • green wire    -> +5V  = Pin 2
  • white wire -> GND = Pin 6
  • yellow wire  ->  GPIO 15 = Pin 10

Those Pin numbers are valid for Raspberry model B revision 2. If you are using a different Raspberry model or revision make sure to select the correct GPIO layout in order to avoid issues.

Step 4: Wiring Relay module

As shown in the final circuit diagram above, I need to add a new relay which is controlled by a GPIO (#15) of the raspberry pi.

In the past I have bought a 5V relay module online from

As I had this module in my workbench I have decided to use it for this project.  Obviously you can use any other module or relay you want. In any case I really suggest to be sure to add the protection diode in order to avoid "surprises" with your raspberry. With no protection diode you can burn the GPIO line of your raspberry.

I have made the wiring as follow:

white wire ->  pin - of the module
green wire   ->  pin + of the module
yellow wire   ->  pin S of the module

Merely for assembly issues into the junction box I have used 3 pairs of wires. This way I have a longer wiring and an easier routing inside the box.
This is essentially needed as with short wires the connection to GPIO of raspberry is quite unstable. On the contrary with longer cables the connection to GPIO pins is more solid and stable.

I have then wired the wires from raspberry with the wires from relay module using a small "mammut" as shown in the picture below

This is obviously optional. Everyone can decide whether do it or not in this way.

Step 5: Fitting everything in the box

At this stage the wiring process is over. The relay module is properly connected to the raspberry. Now we only need to assemble and fit all the component inside the junction box.

I have fixed the raspberry to the screw previously added to the box. Make sure the glue is solid (I have applied it twice :) )

Now I have connected the  Netgear WNCE2001  to an available USB port to get power and to the ethernet port of the raspberry.
This way I have a stable and fast connectivity to my wifi network.

The wifi dingle I had was not reliable enough for a stable wifi connection.

As always the reader is free to select a different mechanism to gain network connectivity (wifi, wires, ...). Important is to get access to the Internet.

Now is the time to set in place the relay module.
In order to continue I had used a small trick to gain additional space in my junction box.
I have added a thin plexiglass layer on top of the raspberry and I have fix it to the only available screw in this project.

This way I have created a new empty layer on which I can position the relay module which it is also fixed to the same screw as before.

Step 6: Wiring to the heater and box closing

We have now reached the final stage.

  • Insert the SD card with Raspbian OS and custom control software
  • Plug of power cable
  • Wiring to the existing heating system circuit according to final circuit diagram

Now I have applied the cover of the junction box and fixed the screws.

If needed or preferred you can apply some sealant material to the slots. I have not done this as I am lazy :) and especially as my heater room is completely dry.

Obviously in the future (never :) ) I will apply some insulating tape to the blue and brown wire. In the end I am not very interested in the electrical part of this portion. The fun is with the control software....


Possible improvements that I have in mind for the future:

  • replacing the Netgear wifi module with a smaller USB wifi dongle which is properly working
  • replacing raspberry with model A+. smaller sizes and lower power consumption
  • replacing the junction box with a smaller one
  • replacing raspberry with arduino and RF receiver. This will reduce the cost of this project


In this post Controllo remoto per caldaia e raspberry I have described the control software for the raspberry server and for the client of this project.


I have had a lot of fun with this small home project. With just few Euro I now have a system which allows me to remotely control my home heating system in a way which is much more flexible than the legacy on the wall thermostat.

Obviously I could have found existing solution on the market and paid an higher price for it. However I would have missed the fun and the learning experience

Anyone which has improvements or new ideas for this project is welcome to share them. I will be more than happy to add it to my project.

Sensore Temperatura Vano Caldaia

Nel precedente posto abbiamo visto come creare un controllo remoto per caldaia.

In questo articolo faccio vedere come ho aggiunto un sensore di temperatura al mio vano caldaia.

Questo mi serve siccome in inverno la temperatura puo' scendere considerevolmente e danneggiare i tubi della caldaia.
Un controllo della temperatura mi dovrebbe permettere di prevenire ogni sorta di problema.

Ho usato, come spiegato in quest'articolo , per visualizzare la temperatura del vano caldaia

Sensore di temperatura DTH11

Siccome ho a disposizione un sensore di temperatura DHT11 lo utilizzo nel mio progettino.

Questo sensore implementa un semplice protocollo 1-wire.

Questo articolo mi ha aiutato a capirne meglio il funzionamento e mi ha anche fornito la base del codice per leggere i dati dal sesore.

Io ho apportato delle modifiche al codice siccome non mi interessa il valore di temperatura.

Faccio notare che per il funzionamento di questo codice sul tuo Raspberry deve essere installata la libreria wiringPi qui disponibile

Cablaggio Sensore

  • filo verde -> Data
  • filo arancione -> +5V
  • filo giallo  -> GND

Come nell'articolo precedente ho cablato il sensore con l'aiuto di un piccolo mammuto, sempre per ragioni di disposizione all'interno della mia scatola a muro.

Come si nota il filo verde (Data) e l'arancione (+5V) ho inserito una resistenza da 10K ohm. Questo per stabilizzare la lettura del sensore.
Ho notato che anche senza resistenza ottengo i medesimi risultati dal sensore quindi se non l'avete potete ometterla. Se invece vedete che avete troppe letture non valide vi consiglio di aggiungerla come in figura.

Infine ho cablato il sensore al Raspebrry in questo modo:

  • filo verde -> pin 26 = GPIO7
  • filo giallo -> pin 25 = GND
  • filo arancio -> pin 4 = +5V

Infine ho rimontato il tutto nella mia scatola a muro e ho lasciato il sensore di temperatura all'esterno

Codice di lettura

Come detto in precedenza ho apportato delle semplicissime modifiche al codice di lettura della temperatura e umidita'.

 /* let's read 3 correct temperature values*/
  while(count < 3) {
      t = dht11_read_val();
      if (t != 9999) {
          temp[count] = t;

  /*calculate the average temperature out of the 3 reads from sensor*/
  avg = (temp[0] + temp[1] + temp[2])/3;

  printf("%.2f", avg);

La funzione  dht11_read_val legge il valore di temperatura dal sensore. Se il valore resitituito e' 9999 significa che c'e' stato un errore di lettura e non e' valido.
Ho implementato un semplicissimo ciclo che legge le temperature fintantoche' non 3 temperature non sono lette correttamente.
A questo punto calcolo la media matematica e stampo il valore.

Questo valore verra' poi utilizzato dal codice python per inviare un messaggio PubNub a per la visualizzazione

def update_fb_status_temp():
        command = "/home/pi/SMHA/DTH11/dth11_sensor"
        process = subprocess.Popen(command, stdout=subprocess.PIPE)
        temp = process.communicate()[0]"updating Temperature: %s statuys on FB" %temp)

def fb_update_status_temp(temp):
    pubnub_mex = '{"temperature":"%s"}' %temp"sending pubnub FB message: %s" %pubnub_mex)
    pubnub_freeboard.publish(CHANNEL_FB, json.loads(pubnub_mex))

Come sempre tutto il codice e' disponibile su gitHub

Chiunque voglia apportare delle migliorie o abbia delle idee si faccia vanti. Saro' ben lieto di incorporarle nel mio sistema di controllo remoto della caldaia

giovedì 27 novembre 2014

Create la tua Dashboard con freeboard e PubNub

in questo post spiego brevemente come creare una semplice ma efficace dashboard basata su un paio di servizi molto interessanti:

Ci sono due concetti fondamentali:

  • DataSource: cioe' come e da dove la dashbaord riceve i dati da visualizzare
  • Widget: oggetto grafico che visualizza in modo specifico i dati provenienti dal DataSource 

Questi sono i tipi di DataSource supportati ad oggi:

Mentre i Widget supportati sono i seguenti:

E' possibile sviluppare il proprio widget in modo da visualizzare al meglio i propri dati. Questo pero' non fa parte di questo post.

Temperatura Ambienti

Vediamo adesso un esempio pratico. Immaginiamo che in ogni stanza della nostra casa abbiamo un termometro connesso che sia in grado di inviare le letture della temperatura via Internet.

In questo caso immaginiamo che il termometro invii periodicamente il valore di temperatura rilevato come messaggio PubNub su un canale dedicato (e.g. temp1, temp2, temp3)

Per emulare il nostro termometro usiamo PubNub Console. Qui impostate la vostra pub e sub key e inserite il nome del canale.

In questo modo possiamo inviare un semplice messaggio contenente la temperatura della stanza.

Adesso dobbiamo creare la nostra Dashboard:

Dopo aver effettuato il login su freeboard crea una nuova dashboard inserendo il nome.

A questo punto dobbiamo creare un DataSource che "ascolti" il nostro sensore di temperatura (PubNub console nel nostro esempio):

  • Aggiungi un DataSource di tipo PubNub
  • Name: Cucina (o quello che preferisci)
  • Subscriber Key: e' la SUB KEY di PubNub. Deve coincidere con quella inserita in PubNub Console
  • Channel: il canale su cui mettersi in ascolto per le letture di temperatura. Deve coincidere con quello inserito in PubNub Console

Adesso che abbiamo creato un DataSource valido aggiungiamo il widget in questo modo:

  • ADD PANE: un nuovo pannello vuoto viene creato
  • Fai click sull'icona +:
  • TYPE: Sparkline 
  • TITLE: Temperatura Cucina
  • VALUE: datasources["Cucina"]["temperatura"]

A questo punto un nuovo widget vuoto di tipo Sparkline viene aggiunto alla tua dashboard

Adesso non ci resta che inviare le letture di temperatura tramite PubNub Console (prova ad inviare 5 letture diverse di temperatura). In realta' queste saranno inviate dal nostro termometro intelligente in modo automatico

Ogni volta che invierete una nuova lettura di temperatura il vostro widget nella vostra dashboard si aggiornera' automaticamente.

Spero sia utile.

Altre idee su come usare freeboard? dai aspetto i vostri commenti

martedì 25 novembre 2014

Controllo Remoto per Caldaia - Raspberry e Client SW

Dopo aver visto come assemblare la parte HW/elettrica per il nostro  Controllo Remoto per Caldaia - HW in questo post descrivo come ho realizzato il software per il Raspberry

Architettura SW

Raspberry pi SW

Come avrete letto negli altri post sono un estimatore del pattern Publish-Subscribe e la rete PubNub lo implementa egregiamente.

Piu' nello specifico il Raspberry Pi si comporta da Subscriber in quanto ascolta il canale di comunicazione e attende la recezione di messaggi indirizzatti al Raspberri.

Al contrario i vari client (nel mio caso semplicissima web app per mobile e calendario di configurazione per PC) si comportano da Publisher in quanto inviato messaggi di comando indirizzati al Raspberry.

Tutti i messaggi sono protetti da encryption AES e sono veicolati su un canale SSL (PubNub fornisce tutti questi servizi). In aggiunta ho implemntato un semplice meccanismo di autorizzazione in modo da essere sicuro che soltanto i client autorizzati (i miei) possano pilotare la mia caldaia.

Per chi ricorda questo episodio di Big Bang Theory alla fine della puntata dei ragazzi asiatici accendono e spengono le luci di Howard. Ecco noi cerchiamo di evitare questa cosa... :)


Come e' ovvio altri tipi di arcitetture o meccanismi di comunicazione sono possibili.
Io ho scelto di usare PubNub in quanto:

  • PubNub fornisce un SDK praticamente per qualunque piattaforma esistente
  • Il software su Raspberry e' semplificato al massimo
  • Non devo far girare un webserver e quindi aprire una porta del mio firewall
  • Posso implementare semplicemente un mecchanismo di analytics/monitoring


Ho messo a disposizione di tutti su GitHub il codice che deve girare sul Raspberry.
Chiunque lo puo' scaricare e migliorare. 

Client SW

Per il lato client ho sviluppato 2 semplicissime applicazioni che girano su OpenShift (come avrete letto nei post precedenti sono un'utente di OpenShift molto soddisfatto - il datacenter e' Cisco UCS).

La prima e' una semplice applicazione web che mi permette di controllare lo stato della caldaia e di accenderla e spegnerla su mio comando.

Come potete vedere la veste grafica e' veramente poco attraente. Se qualcuno di voi ha capacita' grafiche si faccia avanti. Aiutera' certamente a migliorare questo progetto

La seconda e' un'applicazione legegrmente piu' complessa che va usata su PC e permette la programmazione settimanale della caldaia. Esattamente come il termostato a muro ma molto piu' flessibile.

Come vedete in figura io uso nella mia programmazione anche le informazioni relative alle valvole termostatiche applicate sul termosifone ma e' solo una visualizzazione grafica.
Cio' che accende e spegne la caldaia sono solo gli eventi "caldaia" rappresentati in verde nel mio esempio.

Ovviamente le due applicazioni sono utilizzabili parallelamente. Quindi se ho programmato l'accensione della caldaia ad un certo orario e per esempio rietro a casa con 2 ore di ritardo posso decidere di spegnere la caldaia manualmente tramite la prima app.

Il codice di entrambe le applicazioni (e' una sola applicazione Rails) e' disponibile qui SMHAC

Spero questo vi sia utile e spero che qualcuno contribuisca al miglioramento della veste grafica.

domenica 23 novembre 2014

Controllo Remoto per Caldaia - HW

In questo post descrivo come ho sviluppato un semplice controllo remoto per il mio sistema di riscaldamente casalingo.

Il mio obiettivo e' di creare un semplice sistema che risponde a queste due domande:

  1. come accendo/spengo il riscaldamento quando sono fuori casa? 
  2. come programmo in modo flessibile il mio sistema di riscaldamento? 

Attualmente il riscaldamento autonomo e' controllato dal classico termostato a muro

Cio' non mi fornisce la flessibilita' richiesta per i punti #1 e #2

Un giorno che mi e' capitato un raspberry pi model B per le mani e quindi mi sono detto: perche' non rimpiazzare il termostato a muro con un raspberry?

Da qui ho iniziato questo home project.

Il primo passo e' stato ottenere l'approval dal mio boss (moglie ???) :), la quale ha immediatamente aggiunto un terzo requisito:

3. il controllo tramite termostato a muro deve sempre essere funzionante e non essere rimpiazzato dal raspberry

 Bene adesso che tutti i requisiti sono chiari posso iniziare la realizzazione.

Circuito Iniziale

Il circuito di accensione della caldaia e' il seguente:

Circuito Finale

Per rispettare il requisito #3 ho modificato questo semplice circuito nel modo seguente:

In questo modo abbiamo realizzato un OR logico tra il Raspberry Pi ed il termostato a muro permettendomi di soddisfare tutti e 3 i requisiti:

  1.  tramite il raspebbry posso far scattare il relay e quindi accendere/spegnere la caldaia da remoto
  2. tramite software posso programmare il raspberry per accendere e spegnere la caldaia in modo flessibile
  3. in caso in qui il Rasperry non funzioni (mancanza di rete, guasto, etc...) la caldaia viene attivata normalmente dal termostato a muro


Per realizzare il controllo remoto della caldaia ho utilizzato i seguenti componenti:

Passo 1: Preparazione del contenitore
Ho posizionato il raspberry in un angolo della scatola di derivazione, dove verra' poi fissato tramite una vite

Siccome la mia scatola di derivazione non e' grande abbastanza per contenere totalemnte il raspberry ho dovuto, in maniera un po' spartana, segnare con una matita dove dovranno essere create le fessure per il cavetto di alimentazione  e per la schedina SD.

Come notate le fessure sono state effettuate con un trapano ed una piccola punta da legno. Se avete uno strumento migliore otterrete delle fessure piu' regolari. Non sono proprio orgoglioso di come ho realizzato le fessure :)

Passo 2: Fissaggio Scatola a muro

Ho forato la scatola con una piccola punta in modo da poter inserire un dado e bullone per fissare il raspberry alla scatola.

Successivamente ho incollato la scatola al muro del mio vano caldaia tramite una colla "mille chiodi". In questo modo ho evitate di forare il muro e di inserire almeno due tasselli.

Ovviamente questa e' stata la mia preferenza. Il lettore e' libero di fissare la scatola al muro nel migliore dei modi.

Passo 3: Cablaggio Raspberry

Il cablaggio e' veramente semplice. Ci servono solamente:

  • VCC +5V
  • GND
  • 1x GPIO (#15) ma se ne puo' usare uno a piacere. Io ho scelto il 15 per ragioni di layout dei fili

In particolare ho cablato i fili sul raspberry in questo modo:

  • filo verde   -> +5V  = Pin 2
  • filo bianco -> GND = Pin 6
  • filo giallo  ->  GPIO 15 = Pin 10

Questi Pin sono validi per Raspberry B revision 2. Se usi un raspberry diversi assicurati di usare il GPIO layout corretto per evitare malfunzionamenti.

Passo 4: Cablaggio modulo rele'

Come visto nello schema del circuito finale devo aggiungere un rele' che sia pilotato da un GPIO (#15) del raspberry.

Tempo fa' ho acquistato un module relay a 5V da un sito online

Siccome avevo disponibile questo modulino l'ho usato per questo progetto. Ovviamente il lettore puo' decidere di usare un altro modulo oppure di usare un rele' senza modulo. Suggerisco in ogni caso l'aggiunta del diodo di protezione altrimenti si rischia di bruciare il raspberry o almeno la linea del GPIO usato.

Ho effettuato il cablaggio del modulo rele' in questo modo:

filo bianco ->  pin - del modulo
filo verde   ->  pin + del modulo
filo giallo   ->  pin S del modulo

Per ragioni di assemblaggio all'interno della scatola a muro ho usato 3 coppie di fili in modo da avere un cablaggio piu' lungo. Infatti con i fili a mia disposizione ho trovato difficile far restare in posizioni i fili sul connettore dei GPIO di raspberry. Al contrario con un cablaggio piu' lungo ho eviatto il problema.

Quindi nel mio caso ho poi collegato i fili dal raspberry a quelli del modulo rele' tramite un piccolo mammut

Questo cablaggio non e' obbligatorio. Lascio al lettore la decisione finale.

Passo 5: Assemblaggio del circuito nella scatola a muro

A questo punto abbiamo finito con i semplici cablaggi del raspberry e del modulo rele'. Adesso non mi resta che montare il tutto all'interno della scatola a muro.

Ho fissato il raspberry alla scatola tramite la vite precedentemente inserita. Assicuratevi che la colla mille chiodi abbia fatto presa bene (a me si e' staccata due volte :) )

Dopo ho collegato il Netgear WNCE2001  ad unaporta USB per l'alimentazione dello stesso ed un corto cavo ethernet alla porta del raspebrry.
In questo modo ho una connettivita' alla mia rete wifi stabile e funzionante.

Il dongle Wifi a mia disposizione si e' rivelato instabile e non affidabile.

Come sempre il lettore e' libero di utilizzare la soluzione preferita per avere connettivita' ad Internet.

Ora devo alloggiare il modulo rele' correttamente cablato come visto sopra.
Per far cio' ho adottato un piccolo stratagemma dato che non avevo altro spazio utile nella scatola a muro.
Ho inserito una piccola lastra di plexiglass sopra il raspberry e l'ho fissata tramite l'unica vite presente.

In questo modo ho creato un secondo "piano" su cui alloggiare  il modulo rele' che a sua volta e' fissato tramite l'unica vite presente.

Passo 6: Collegamento alla caldaia e chiusura scatola a muro

A questo punto siamo nella fase finale.

  • Inserimento scheda SD con Raspian e software di controllo
  • Inserimento spinotto di alimentazione
  • Collegamento al circuito di accensione della caldaia come definito nel circuito finale

Dopo di cio' ho chiuso la scatola a muro che le viti fornite

Se gradito si possono chiudere le fessure con silicone o altro sigillante. Io non l'ho fatto siccome sono lazy e siccome il vano caldaia e' completamente asciutto.

Ovviamente in un futuro (mai :) ) mettero' del nastro isolante per coprire i fili che per'altro sono gia isolati :). Insomma la parte da elettricista non mi interessa. :) La parte divertente e' il software di controllo.....


Possibili ottimizzazioni che ho gia' in mente:

  • sostituzione modulo Netgear per connettivita' Wifi con dongle USB funzionante
  • sostituzione raspberry con modello A+ di minor dimensioni e consumo
  • sostituzione scatola a muro con una di minor dimensioni
  • sostituzione raspberry con modulo arduino e ricevitore RF con conseguente riduzione costi


In questo post Controllo remoto per caldaia e raspberry ho descritto il software per il Raspberry e per il client.


Questo mini progettino casalingo mi ha divertito parecchio. Con poca spesa adesso ho un sistema di controllo del mio riscaldamento casalingo infinitamente piu' flessibile del classico termostato a muro.

Ovviamente avrei potuto cercare delle soluzioni sul mercato, ma in puro spirito "maker", "tinkering" e' piu' divertente farsi le cose dasolo.

Chiunque abbia delle migliorie si faccia sotto. Saro' ben felice di apportarle al mio progetto.


Nel mio caso ho notato che il raspberry dopo un certo periodo (circa 30+ minuti) di inattivita' perdeva la connettivita' wifi. Molto probabilmente e' dovuto ad uno stand-by del modulo Netgear.

Per evitare cio' ho aggiunto una semplicissima linea al cron

*/30 * * * * /home/pi/



logger "*********************************************"

upt=`uptime | awk -F " " '{print $3}'`

for i in {1..3}; do

    ping -c 1

    logger `date` ping GOOGLE $i -- uptime: $upt

    sleep 1


logger "*********************************************"
Lo script e' banalissimo e pinga google per 3 volte ogni 30 minuti

Cosi' il problema e' stato risolto in maniera banale ed ora il raspberry e' sempre raggiungibile via Internet (ops non proprio da tutti ) :)

PS: tempo libero permettendo seguiranno un paio di post per il software di controllo sia lato server che lato client.....