domenica 15 gennaio 2017

Software per valvola termostatica TM3030 con estensione wifi- Progetto Walvola - SW


Questo post descrive il software da far girare sulla valvola TM3030 












Software

Sul mio github e' disponibile tutto il progetto Walvola, ed in particolare il software di  controllo della valvola e' disponibile [qui]




Chiaramente il software e' aperto e disponbile a tutti. Inoltre il software e' 'as is', cioe' proprio in base alla natura aperta io condvido il software che ho sviluppato per le mie esigenze.

Ovviamente supporto l'idea di accettare contributi esterni. Quindi chiunqe trovi il softyware utile e voglia contrbuie con delle miglorie e' il ben accetto.


Architettura


Il sistema di controllo remoto dell'impianto di riscaldamneto (valvole termostatiche e caldaia) adotta un'architettura flessibile e scalabile basata sullo scambio di messaggi MQTT.

L'architettura non prevede l'utilizzo e l'intermediazione di un controllore centrale ma e' totalmente distribuita.








Elementi Architetturali

I suoi elementi costituenti sono:

  • Walvola: elemento montato direttamente sul termosifone che ha il compito di azionare il motore della valvola che comanda un pistoncino che permette o impedisce il flusso dell'acqua calda all'interno del termosifone






  • IRB: elemento montato nel vano caldaia che ha il compito di attivare/disattivare il bruciatore della caldaia murale






  • iHeatingun'applicazione web mobile basata su framework7 che permette il controllo remoto da un qualsiasi dispositivo mobile o web browser



Funzionamento

Come detto sopra, il sistema di comunicazione si basa su un'architettura pub/sub in cui gli elementi che comunicano tra di loro (le valvole ed le applicazioni mobili) non sono fortemente connessi.
In particolare l'applicazione mobile viene a conoscenza dell'esistenza di una o piu' valvole tramite un semplice meccanismo di advertising. Cio' signigica che non e' necessaria nessuna configurazione particolare dell'applicazione mobile quando si aggiunge/rimuove una valvola, ma la lista delle valvole disponibili viene creata ed aggiornata dinamicamente.

Il software della valvola e' architetturalmente semplice ed implementa la funzione di:

  • Subscriber: rimane in ascolto di messaggi pubblicati dai publisher e in caso di ricezione li processa andando as eseguire il comando inviato
  • Publisher: informa gli altri elementi dell'architettura sul proprio stato interno tramite lo scambio di messaggi MQTT






Organizzazioe Topic MQTT

A questo punto e' chiaro che lo scambio di messaggio tra le varie valvole e le applicazioni mobili avviene tramite il protocollo MQTT. Piu' in particolare tale protocollo si basa sul concetto di topic, che in sostanza e' un canale di comunicazione tra uno/molto publisher ed uno/molti subscriber.

Nel software di controllo in questione i topic sono creati dinamicamente dal software non necessitano di nessuna configurazione iniziale.

Nel dettaglio i topic sono organizzati nel seguente modo:






Ogni valvola riceve i messaggi MQTT su un topic di ingresso ad essa dedicatao. Allo stesso modo ogni valvola pubblica messaggi MQTT verso i destinatari su un topic di uscita dedicato.

I topic in ingresso seguono la seguiente naming convention:

  • <nome del topic>/in/<label valvola>

Mentre i topic in uscita seguono la seguiente naming convention:

  • <nome del topic>/out/<label valvola>

dove:
  • <nome del topic>: e' il nome del topic univoco comune per un intero sistema
  • <label valvola>: e' il nome univoco di ogni valvola o IRB

Funzionalita' e comandi supportati

Il software e' attualmente alla sua release 1.3 e supporta una serie di comandi base ed implementa alcune funzionalita' di monitoring e controllo.

Piu' in dettaglio le funzionalita' attualemente supportate sono:
  • ricezione comandi da apllicazione mobile
    • GET_STATUS: comando di richiesta stato valvola. Quando la valvola riceve sul suo topic di ingresso tale comando, legge il suo stato interno lo posta sul topic di uscita a lei dedeicato
    • SET_STATUS: comando di variazione stato valvola. Un applicazione di controllo puo' richiedere alla valvola, tramite questo comando, di cambiare il suo stato in uno dei seguenti:
      • WALVOLA_ON:  stato di valvola aperta. Una volta che la valvola e' tutta aperta il pistoncino e' completamente ritratto e quindi permette il flusso d'acqua massimo attraverso il termosifone
      • WALVOLA_OFF: stato di valvola chiusa. Una volta che la valvola e' tutta chiusa il pistoncino e' completamente esteso e quindi impedisce il flusso d'acqua attraverso il termosifone
      • WALVOLA_OTA: stato di valvola in upgrade software. Quando la valvola e' in questo stato non esplica le sue normali funzioni, ma rimane in attesa del caricamento Over The Air di una nuova versione del software. Importante notare che al termine del caricamento del software la valvola viene resettata.
      • RELAY_ON: stato di relay aperto. Apre il relay collegato alla caldaia attivando il bruciatore.
      • RELAY_OFF: stato di relay chiuso. Chiude il relay collegato alla caldaia disattivando il bruciatore.
    • GET_INFO: un applicazione di controllo richiede informazioni relative alla valvola che riceve tale comando. La valvola fornisce sul suo topic di uscita dedicato informazioni relative a:
      • versione software
      • voltaggio alimentazione (batterie)
      • indirizzo IP assegnato
    • UPDATE: comando di aggiornamento software della valvola. Il software implementa a funzionalita' di update Over The Air [qui piu' informazioni] permettendo l'aggiornamento della valvola senza doverla smontare dal termosifone. Nota: OTA e' difficilmente implementabile su di un modulo EPS8266-01 a causa delle dimensioni limitate della RAM. Questa modalita' e' supportata dal modulo ESP8266-12 e da altri moduli di tale famiglia.
  • due modalita' operative:
    • Walvola: il software svolge le funzionalita' di controllore di una valvola termostatica per termosifone
    • IRB:il software svolge funzionalita' di controllo di un relay per accensione/spegnimento bruciatore
  • due modalita' di risparmio energetico (piu' info [qui]):
    • DEEP SLEEP:  polling periodico del topic MQTT di ingresso con funzionalita' deep sleep per risparmio energetico.
    • MODEM SLEEP:  per i moduli che non supportano il deep sleep, implementazione della modalita' modem sleep. Nota: il modulo EPS8266-01 non supporta direttamente la modalita' deep sleep causa mancanza di una connessione tra due pin specifici del chip Espressif. E' possibile modificare il modulo ESP8266-01 in modo che possa supportare il deep sleep. L'operazione richiede una certa manualita' con il saldatura. In ogni caso [qui] le informazioni correlate
  • software upgrade in loco OTA: come menzionato in caso di utilizzo del modulo EPS8266-12 e' possibile aggiornare tramite web browser il software della valvola senza dover smontare la valvola dal termosifone.
  • monitoraggio carica batterie: la valvola periodicamente legge il voltaggio ai piedini di alimentazione e ne posta il risultato su un servizio cloud chiamato kee disponibile [qui]. Questo mi permette di monitorare il consumo delle valvole e di ottenre dei grafici di scarica delle batterie

  • notifica telegram: la valvola notifica il cambio del proprio status inviando un messaggio telegram. In tal modo ricevo delle notifiche push sul mio cellulare per sapere sempre lo stato del mio sistema di riscaldamento. Nota:  nella versione attuale il messaggio telegram e' disabilitato causa di un bug nella libreria SSL. Sto debuggando il problema ed faro' un commit su github con il fix quanto prima








Organizzazione del software

Il software e' uno sketch Arduino basato sui seguenti file:


  • Walvola.ino/h: file principale dello sketch. Contiene i classici setup e loop
  • wifi.cpp/h: contiene le funzioni relative alla connettivita' wifi e all'implementazione del model sleep
  • timeapi.cpp/h: contine le funzioni per interfacciarsi con il serivizo http://www.timeapi.org/ per ottenere la data e l'orario aggiornati (chi mi segue sa' che non sono un supporter del RTC)
  • telegram.cpp/h: funzioni per l'invio di messaggi telegram. Nota:  nella versione attuale il messaggio telegram e' disabilitato causa di un bug nella libreria SSL. Sto debuggando il problema ed faro' un commit su github con il fix quanto prima
  • mqtt.cpp/h: funzioni per la gestione della connettivita' MQTT e per il processamento dei comandi
  • misc.cpp/h: funzioni generali di supporto
  • keen.cpp/h: funzioni per l'invio della lettura del voltaggio batterie versio il servizio https://keen.io/
  • json.cpp/h: funzioni per la gestione dei messaggi JSON ricevuti dall'applicazione controller

Configurazione del software

Il software necessita di una serie di parametri configurazione da scpecificare prima della compilazione e delle generazione del binario da caricare sul modulo ESP8266.

Vediamo qui in dettaglio quali parametri sono configurabili e dove sono disponibili.

  • Walvola.ino:
    • keen_voltage_collection: sostituire il valore YOUR KEEN.IO VOLTAGE COLLECTION con il nome della collezione kee.io su cui postare le letture del voltaggio della batteria. Notare che in cosa nome della collezione viene aggiuno il nome della valvola


  • Walvola.h

    • WALVOLA_DEEP_SLEEP_MODE: definisce la modalita' di funzionamento DEEP SLEEP. commentare per rimuovere tale funzionalita'
    • WALVOLA_MODEM_SLEEP_MODE: definisce la modalita' di funzionamento MODEM SLEEP. commentare per rimuovere tale funzionalita'
    • WALVOLA_ROLE: definisce la modalita' operativa Walvola e quindi il modulo si comporta di conseguenza (attivazione motore/pistoncino)
    • IRB_ROLE: definisce la modalita' operativa IRBe quindi il modulo si comporta di conseguenza (attivazione relay)
    • OTA_MODE:  abilita il supporto all'upgrade software in modalita' OTA via browser
    • DEBUG: abilita' i messaggi di debug su seriale
    • MQTT_DEBUG: abilita' il post dei messaggi di debug su uno specifico topic chiamato (<nome del topic>/out/<label valvola>/debug)
    • WALVOLA_DELAY_ON: numero di millisecondi in cui il motore viene attivato per aprire la valvola e ritrarre il pistoncino
    • WALVOLA_DELAY_OFF: numero di millisecondi in cui il motore viene attivato per chiudere la valvola ed estendere il pistoncino
    • WALVOLA_LABEL: nome della valvola
    • WALVOLA_ID: id univoco della valvola

  • kee.h:
    • KEEN_PROJECT_ID:   sostituire il valore YOUR KEEN.IO PROJECT ID con l'id univoco del tuo progetto keen.io
    • KEEN_MASTER_KEY: sostituire il valore YOUR KEEN.IO MASTER KEY con il valore univoco della tua MASTER KEY relativa al tuo progetto keen.io

  • mqtt.h:

    • MQTT_UNAME: sostituire il valore YOUR MQTT BROKER ACCOUNT USER NAME con il tuo username per l'accesso al broker MQTT
    • MQTT_PASSW: sostituire il valore YOUR MQTT BROKER ACCOUNT PASSWORD con la password per l'accesso al broker MQTT
    • MQTT_BROKER_PORT: porta di accesso al tuo broker MQTT

  • mqtt.cpp

    • mqtt_walvolas_topic:sostituire il valoreYOUR TOPIC con il nome del tuo topic univoco per il tuo sistema
    • mqtt_controllers_topic:sostituire il valoreYOUR TOPIC con il nome del tuo topic univoco per il tuo sistema
    • mqtt_controllers_topic_debug: sostituire il valoreYOUR TOPIC con il nome del tuo topic univoco per il tuo sistema

  • wifi.cpp:

    • wifi_ssid:  SSID della tu arete wifi
    • wifi_passwd: password della tua rete wifi

Conclusioni

Nel post Come aggiungere il controllo wireless ad una valvola termostatica TM3030 - Progetto Walvola - HW abbiamo visto come realizzare la parte Hardware del progetto Walvola. Ho presentato lo schema elettrico ed il PCB del controller della valvola.
Ho anche spiegato come modificare la valvola per sostituire il suo controller originale con quello da me sviluppato.

In questo posto ho messo a disposizione su github il software Walvola da caricare sul modulo precedentemente sviluppato.
Ne ho spiegato l'architettura generale, le funzionalita' base e di comandi attualemente supportati. 
Infine ho descritto tutti i parametri di configurazione in modo che ognuno possa adattare il software al suo ambiente specifico.

Per il monitoring del voltaggio io uso il servizio https://keen.io che chiaramente non e' obbligatorio o puo' essere sostituito con altri servizi simili.

Come broker MQTT io uso https://www.cloudmqtt.com/ che offre un tier gratuito ed e' estremamente affidabile. Ovviamente potete usare un qualsiasi altro broker MQTT.

Se qualcuno trova il software utile si senta libero di utilizzarlo e se vuole contribuire con nuove funzioni sono apertissimo a discuterne.

In ogni caso queste serie di articoli dimostra come con un semplice modulino come ESP8266 si possano realizzare sistemi IoT utili alla vita di tutti i giorni. L'implementazione di tutte le parti richiede una serie di competenze che il lettore puo' gia' possedere o no. In ogni caso ritengo questa serie di post una buona occasione per cimentarsi con una serie di temi che spaziano dalla realizzazione di un PCB, dall'uso di servizi cloud e fino alla realizzazione di un applicazione mobile.

Se volete aiutarmi a migliorare questo progetto e se e' per voi utile lasciate i vostri commenti qui sotto.

Buon divertimento!!!


          martedì 10 gennaio 2017

          Come aggiungere il controllo wireless ad una valvola termostatica TM3030 - Progetto Walvola - HW

          In questo post descrivo come ho realizzato una valvola per termosifoni controllabile via Internet denominata Wireless Valvola (Walvola). Qui descrivo la versione 4 in quanto le versioni precedenti sono obsolete causa problemi legati al layout del PCB ed ai consumi della batteria.

          Il post e' strettamente collegato ad un mio progetto precedente (post originali Controllo Remoto per Caldaia - HW e Controllo Remoto per Caldaia - Raspberry e Client SW)





          Background

          Come spiegato nei post menzionati sopra, fino ad ora ho avuto la possibilita' di accendere/spegnere la caldaia per riscaldamento tramite un paio di app web (una solo accendi e spegni e la seconda un calendario per programmazione giornaliera/settimanale).
          Questo e' molto funzionale con il mio stile di vita e con la mia presenza/assenza in casa.

          Tuttavia un problema che ho riscontrato e' la necessita' disincronizzare esattamente le valvole con l'accensione della caldaia onde evitare che la caldaia vada in blocco. (se tutte le valvole sono chiuse ed il bruciatore parte l'acqua va in ebollizione in pochissimi istanti e la caldaia va in blocco - almeno nel mio impianto).

          Anche dopo un'accurata pianificazione e sincronizzazione il sistema, benche' funzionante, e' poco flessibile generando degli sprechi di energia o comunque riscaldando la casa quando non necessario.

          Per esempio se programmo la valvola camera letto e la caldaia per accendersi alle 21 ma sono in pizzeria e tardo e rientro alle 23 con il sistema attuale non posso fare nulla in quanto la valvola si apre automaticamente alle 21. Questo perche' non ho controllo sulla valvola da remoto.

          Questo progetto ha come obiettivo l'eliminazione del problema descritto sopra rendendo cosi' il mio sistema di riscaldamento casalingo completamente controllabile da remoto e quindi altamente flessibile.

          Valvola Termostatica

          Ho applicato su ogni termosifoni di casa una valvola termostatica elettronica della Technoline modello TM3030 








          Questa valvola e' un oggettino molto interessante.
          Si puo' aprire e chiudere come una qualsiasi valvola termostatica in base alla temperatura. Inoltre puo' essere programmata fino a 5 chiusure/aperture giornaliere in base ad un calendario settimanale.
          Quest'ultima funzionalita' e' stato il motivo principale della mia scelta.

          Come spiegato sopra nonostante siano ottime funzionalita', non sono abbastanza flessibili per il mio scopo.

          In questo articolo spiego come rendere qusta valvola wireless e controllabile da remoto con pochissimi euro (circa 3/4 euro per valvola).


          Lista Materiali

          Per questo progetto ho utilizzato i seguenti componenti


          Basetta ramata




          Basetta ramata singola faccia dalle dimensioni di 45mm x 48mm


          Transistor PNP



          Due (2) transistor PNP tipo 2N3906 o simile


          Transistor NPN






          Quattro (4) transistor NPN tipo BC547 2N3904 o simile


          Resistenze



          8 resistenze da 10K ohm e 1 resistenza da 470 ohm


          Condensatori





          1 Condensatore elettrolitico da 100uF e 1 Condensatore da 470 pF o simile


          Modulo ESP8266-12





          Modulo wireless ESP8266-12 per connessione remota

          Fili



          1 piccolo pezzo di filo (circa 0,5 centimetri)  da usare come ponticello per il PCB
          4 spezzoni di filo per connettere la nuova scheda di controllo alla valvola.



          Schema Circuito v4

          La valvola TM3030 e' composta essenzialmente da un motore elettrico DC alimentato da due pile AA (3V), da un meccanismo di riduzione della velocita' e di sollevamento/abbassamento pistoncino e da una piccola scheda di controllo.

          In questo progetto la scheda di controllo viene completamente rimossa e sostituita da una progettata appositamente.





          Il circuito implementa un Half Bridge  a 6 transistor, in modo da poter pilotare il motore e farlo girare in entrambe le direzioni per sollevare/abbassare il pistoncino della valvola e quindi chiudere/aprire il termosifone.

          Il funzionamento e' semplicissimo e viene controllato dai piedini 4 e 5 del modulo EPS8266-12 in base al seguente schema


          • pin4 = ON e pin 5= OFF -> motore gira in una direzione
          • pin4 = OFF e pin 5= ON -> motore gira in nella direzione opposta
          • pin4 = OFF e pin 5= OFF -> motore fermo
          • pin4 = ON e pin 5= ON -> non ammesso

          In questo modo posso azionare e fermare il motore via wireless e quindi da remoto (Internet).


          Schema PCB v4

          Ho realizzato il seguente PCB posizionando i componenti in modo da lasciare quanto piu' spazio possibile per il motore della valvola. sul lato componenti della basetta.

          Qui potete vedere tutti i passi su come realizzare il PCB a casa in maniera autonoma.







          Il progetto fritzing completo e' disponibile sul mio github.




          Come si vede sul lato destro ho posizionato le piazzole per la saldatura del modulo ESP8266-12. Pertanto il modulo viene saldato lato rame, lasciando ampio spazo sul latocomponenti per poter alloggiare il motore della valvola.

          Il PCB e' stato intenzionalmente realizzato senza piano di massa per semplificare il PCB e la realizzazione casalinga. Chi vuole puo' aggiungerlo da se. In ogni caso non e' strettamente necessario per quetso tipo di circuito in quanto non ci sono segnali critici da veicolare.




          Circuito e PCB v5

          Su github e' presente la versione 5 della scheda che aumenta la stabilita' al risveglio del deep sleep.










          Scheda di controllo

          Qui la scheda che implementa il circuito visto prima (v4)





          Qui il PCB completamente montato con tutti i componenti








          Come si vede ho docuto sagomare la basetta per poterla alloggiare nello spazio ridotto presente nel'involucro della valvola TM3030.
          Sul lato componenti e' rimasto lo spazio necessario per alloggiare il motore della valvola.


          Modifica valvola

          Una volta realizzato il PCB e saldato i componenti e' necessario aprire la valvola e sostituire la scheda di controllo per rendere la valvola Wireless.

          L'obiettivo e' rimpiazzare la scheda di controllo originale con quella descritta in questo progetto in modo reversibile e quindi lasciando la valvola in uno stato che mi permetta di tornare alla configurazione originale in caso sia necessario (obiettivo non comprarne una nuova se necessario :) ).

          Ecco i passi che ho seguito io:


          Inizio




          Rimozione del coperchio e manopola di programmazione laterale





          Rimozione delle 4 viti per poter aprire la valvola





          Le viti sono di tipo Torx  e quindi serve un cacciavite adattto, tipo questo



          Rimozione delle 4 viti che fissano la scheda di controllo al corpo della valvola






          Dissaldatura e Taglio Fili

          Dissaldatura di questi 3 fili (sono collegati ad un encoder per misurare la posizione della ghiera dentata e quindi del pistoncino). La valvola implemeta una funzione di autocalibrazione e quindi ha bisogno dell'encoder.

          Nella mia versione non ho bisogno di questa funzionalita', inq uanto coem si vedra' nella parte software la valvola si apre e si chiude con un tempo prestabilito.

          E' importante ricordarsi l'ordine di saldatura dei fili per poter ripristinare correttamente la valvola in caso sia necessario.





          A questo punto la scheda di controllo e' collegata all'alimentazione (vano batterie) ed al motore, quindi dobbiamo rimuovere questi collegamenti.

          Mi sono segnato con un pennarello il polo positivo e negativo dei morsetti di alimentazione. (Passo non obbligatorio)



          Con pazienza ho dissaldato i fili evitando di rimuovere troppo stagno dai morsetti.




          Come si vede il modulo di controllo originale non e' piu' collegato all'alimentazione




          mentre e' ancora collegato al motore.




          Per evitare di rovinare il modulo di controllo non ho dissaldato i fili del motore ma ho deciso di tagliarli a meta'. Se dovessi ripristinare la valvola non sara' troppo difficile ricongiungere i fili rispettando i colori.

          Nota: In alcune versioni che ho implementato anziche' tagliare i fili li ho dissaldati dalla baseta originale. Entrambi i metodo portano allo stesso risultato





          Prolunga fili motore


          Ho spellato  i fili che fuoriescono dal motore




          Ora ho spellato due fili della lunghezza di circa 3 centimetri




          e li ho saldati a quelli che fuoriescono dal motore rendendoli cosi' piu' lunghi




          A questo punto ho isolato la giunzione dei fili (l'applicazione del nastro isolante non e' il massimo ma non sono un buon elettricista :) )
          Ho anche saldato i fili dal motore (la prolunga) alla nuova scheda di controllo creata nei passi precedenti.


          I fili vanno saldati in base al seguente schema:





          dove

          • M+ corrisponde al filo rosso del motore
          • M-  corrisponde al filo nero del motore





          Prolunga fili alimentazione


          Adesso ho preparato altri due fili di circa 3 centimetri e li ho saldati ai morsetti di alimentazione.
          Se avessi avuti fili di colore diverso li avrei usati, ma ho usato cio' che avevo in casa :)






          Adesso ho saldato i fili di alimentazione negli appositi fori nella nuova scheda di controllo





          A questo punto la scheda di controllo originale e' stata completamente rimpiazzata dalla nuova scheda di controllo.
          Ho inserito la scheda nel vano batteria e l'ho fissata con una vite (la seconda in basso a sinistra non sono riuscito siccome ho sagomato male la scheda :) )






          Ora posso finalomente richiudere la valvola.
          Riposiziono il motore con le ghiere nell'apposito spazio usando le guide originali.





          Come si vede la nuova scheda con il modulo wireless (lato rame) si adatta perfettamente alla valvola occupando solo lo spazio disponibile permettendo un corretto posizionamentio del motore della valvola.





          Adesso richiudo il corpo principale con le 4 viti rimosse all'inizio ed inserisco nuovamente la manopola laterale.





          Adesso la valvola termostatica e' pronta ed e' ora una Wireless Valvola (Walvola) :)






          Non mi resta che installarla sul termosifone ed iniziare ad usarla :)





          Qui un breve video che mostra che la valvola funziona. Si vede solo che il pistoncino va su (gira a destra) e va giu' (gira a sinistra). Il pistoncino si muove solo di pochi millimetri e quindi non si vede benissimo nel video.





          Conclusioni

          Come descritto nel post ho trasformato con successo una valvola termostatica gia' molto buona in qualcosa di altamente flessibile.
          Il processo descritto si puo' applicare enza troppi problemi ad altre valvole. Il circuito rimane lo stesso. E' possibile che altre valvole abbiano PCB di dimensioni diverse, ma l'adattamento dovrebbe non essere complesso.

          Se sperimentate altre valvole sarei molto curioso di ricevere il vostro feedback