[Internet delle Cose] Gestisci la tua casa: tramite Tweet, Yahoo Weather e Time Schedule

Internet delle cose con Tweet Weather Schedule

Oggi nell'ambito di Internet delle cose vi presento un progetto open source in grado di eseguire 3 attivazioni remote configurate tramite il sito IFTTT. La prima è relativa a Twitter, infatti con un tweet (dal vostro account) potete attivare un led (o quello che volete). La seconda è relativa alle condizioni meteo, infatti grazie a Yahoo Weather potete impostare l'accensione di un led (o della caldaia) se la temperatura (nella località scelta) scende sotto i 15 gradi. La terza attivazione è relativa ad un evento schedulato, come l'accensione delle luci tutte le mattine alle ore 9:00. Tutto questo completamente automatizzato e gestibile dal web, quindi da qualsiasi parte del mondo voi siate! Il progetto è open source e quindi modificabile a vostro piacere, sia a livello hardware, grazie ad FTPmicro, che a livello software. Infatti potete accedere al firmware ed implementare tutte le attivazioni remote che volete. Considerando che IFTTT dispone di ben 75 canali con i quali potete fare le vostre combinazioni ed FTPmicro ben 26 uscite, potete comprendere la potenza di questo dispositivo. Siamo oltre la domotica!

L'hardware di FTPmicro, per realizzare questo progetto, è disponibile in questa pagina quindi di seguito ci concentreremo sulle applicazioni possibili ed ovviamente sul firmware. Per completare la configurazione hardware va solo aggiunto che sono stati inseriti 2 led e le relative resistenze su due pin di uscita di FTPmicro, LED1 = RB0 (pin7), LED2 = RB1 (pin6). Tutto qui!
Ovviamente potete inserire altri led su altre uscite, basta configurare i pin e gestirli tramite software come vedremo più avanti. Inoltre potete sostituire i led con dei transistor che pilotano dei relè di potenza, e quindi attivare tutti i carichi che volete: dalla caldaia al climatizzatore, dalle luci alla tenda motorizzata.

Le 3 attivazioni remote: Twitter,Weather e Time Schedule

Cosa vogliamo fare:

Tramite un Tweet, inviato dal nostro account, vogliamo attivare il LED2. Quindi tramite un tweet con l'hashtag #led2_ON il LED2 farà un lampeggio di 3 secondi.

 

 

Tramite una variazione climatica, in una località da noi definita, vogliamo attivare entrambi i LED. Nel nostro caso, se la temperatura scende sotto i 15 gradi, a Roma, entrambi i led faranno un lampeggio di 3 secondi.

 

 

Tramite una azione programmata, vogliamo attivare il LED1. Tutte le mattine alle ore 9 il LED1 si attiverà per 3 secondi. Ideale per pianificare l'accensione luci la mattina etc.

 

 

Spiegate le nostre intenzioni, siamo quasi pronti per partire all'azione, infatti bisogna fare alcune premesse:

- FTPmicro: leggete con attenzione il documento linkato sopra per avere una conoscenza di base dell'hardware utilizzato;

- IFTTT: verrà spiegato il funzionamento base tra un attimo, se già lo conoscete, potete saltare il paragrafo IFTTT;

- POP3: spiegheremo i comandi base più avanti. Se già li conoscete potete saltare il paragrafo POP3;

Cos'è IFTTT?

Il nome è impronunciabile ma fortunatamente l'acronimo per esteso è più semplice da ricordare: "if this then that". IFTTT è un sito che vi farà letteralmente andare fuori di testa. Trasformerà Internet ed il web, almeno questa sembra essere l'intenzione, in un posto più vivibile per gli utenti.

Come? Questo servizio che si propone come un meccanismo di automatizzazione di una serie di funzioni che sono già disponibili per gli utenti ma che troppo spesso sono incredibilmente macchinose. Vi siete mai resi conto di quanto possa essere seccante decidere di cambiare la propria immagine del profilo su un social network per poi scoprire che la stessa operazione dovreste farla su tutti gli altri? E se magari la cosa che mi interessa fosse automatizzare la sveglia mattutina con le informazioni meteo e la viabilità del traffico? E se una serata con amici in cui scattate delle foto col cellulare voleste memorizzarla anche sul vostro account Dropbox senza doversi preoccupare delle sincronizzazioni varie?

Se avete presente che cos'è e come funziona l'app Evernote, ma soprattutto se la utilizzate, sicuramente alcune cose tra quelle che abbiamo detto vi potrebbe piacere che si rendessero automatizzate. IFTTT si ripromette di lavorare efficacemente proprio con questa app. Descritto così, il servizio sembra quasi un modo per rendere più "a portata di uomo" l'intera mole di informazioni che sulla rete transitano ogni giorno ed effettivamente il risultato sembra davvero possibile.Perché è possibile? Come fa? La risposta è tra le più semplici: IFTTT è un servizio in grado di interfacciarsi con tutti i più noti web services disponibili. Naturalmente si comincia sempre con i social network più diffusi per cui Facebook e Twitter. La lista continua con Dropbox, ma questo potevate intuirlo voi stessi dal momento che l'avevamo già nominato in precedenza. Esiste una funzione di ricerca che vi permetterà di sapere subito se il sito o il servizio o il social network che vi interessa è effettivamente supportato oppure no. E se questo non vi basta, e siete utenti più esigenti, troverete piuttosto interessante la pagina channels.
Vi diciamo soltanto alcuni nomi, giusto perché voi siate incuriositi: App.net, Blogger, Box Boxcar, Buffer, BuzzFeed, Campfire, Delicious, Etsy e, come vi avevamo accennato in precedenza, Evernote. Un totale di 75 canali disponibili (in aumento) vi aiuteranno a rendere la vostra esperienza assolutamente unica.Niente male, non trovate? Ma ciò che rende tutto questo interessante è che ogni utente, accedendo con le proprie credenziali, potrà personalizzare questo sistema in maniera tale da creare egli stesso la sua user-experience, direttamente sulla base delle sue esigenze. E noi queste personalizzazioni le abbiamo espanse, connettendo FTPmicro ad IFTTT per permettere quindi delle azioni remote per il vostro progetto, di domotica, industriale o qualsiasi altra applicazione di Internet delle Cose.

Questo il sito IFTTT.

Leggere le email con POP3

L'utilizzo dei comandi che servono per ricevere le e-mail dai server POP3 da parte di un qualsiasi client di posta non è altro che l'insieme ordinato di una serie di comandi testuali che sono strutturati in maniera da richiedere una risposta al server. Essi vengono utilizzati in funzione della loro definizione che si trova nel RFC 1939 - Post Office Protocol - Version 3.
Vediamone insieme, ora, alcuni tra i più utilizzati:

  • USER <username>;
  • PASS <password>;
  • STAT;
  • LIST;
  • RETR;
  • DELE;
  • RSET;
  • TOP;
  • QUIT.

In questo elenco, naturalmente, <username> e <password>, sembra quasi ridicolo specificarlo, rappresentano le credenziali dell'account di posta interessato.
Questi parametri sono comunicati come testo semplice, esente da formattazione e non vengono criptati in nessun modo. Tutte le risposte che provengano dal server cominceranno con sole due possibili parole chiave: +OK oppure -ERR. Naturalmente si può facilmente capire il loro significato.

Ci sono molte informazioni associate a questi stati che servono ad identificare cosa è andato storto oppure tutti i dettagli della comunicazione avvenuta.

Esempi di comando POP3:

Log-In.
Si tratta della prima e più banale operazione che si possa voler fare. Per effettuare la connessione al server, utilizzando la console oppure il terminale, utilizzando il comando

telnet <servername> 110

in cui, naturalmente, <servername> è il nome oppure l'indirizzo IP del server a cui ci si vuole connettere. Una volta che questa connessione è stata stabilita, ci aspettiamo una risposta del tipo:

+OK POP3 mail.domain.net v2003.83 server ready

Questa indica che il server è pronto e resta in attesa delle credenziali per il collegamento. Naturalmente nessuna altra operazione sarà possibile prima che l'invio di questi dati sia stato effettuato. Bisognerà utilizzare i seguenti comandi:

USER username
+OK User name accepted, password please
PASS password
+OK Mailbox open, 3 messages

Una volta autenticati, è possibile vedere qual è la risposta del server in funzione del fatto che ciascun messaggio inizia con (+OK). Questo significa che non ci sono errori e che si ha accesso alla propria casella con la segnalazione di quanti messaggi non letti ci sono in quel momento.
STAT
Cos'è STAT? Che vuol dire? Si tratta di un comando il cui scopo è quello di mostrare il numero di messaggi. Il comando mostra la quantità di messaggi che sono presenti in quel momento all'interno della casella di posta non che la loro dimensione in byte. Un esempio?

STAT
+OK 3 5467
Che vuol dire che il numero dei messaggi presenti all'interno della casella e tre, esattamente come era già stato dato all'inizio e sicuramente come stato mostrato appena effettuato il login. La dimensione totale occupata viene riportata dal numero immediatamente successivo.
Se vogliamo, invece, un dettaglio meno generale ma dello stesso dato, possiamo utilizzare il comando LIST. Vediamo come funziona:

LIST
+OK Mailbox scan listing follows
1 1823
2 1825
3 1819

Tutto chiaro? Il comando ci ha semplicemente restituito il numero di messaggi indicando il dettaglio della dimensione per ciascuno di essi.
E il comando RETR? Eccolo:

RETR 1
+OK 1823 octets
--- all message headers and message ---
-----------------------------------
------------TEXT-------------------

Ancora una volta il server risponde segnalando che la comunicazione è andata a buon fine e che non ci sono stati errori. Viene mostrato anche quanto è grande il messaggio, in byte, e tutti i caratteri che lo compongo, header ed oggetto compresi.
E se la e-mail la volessimo cancellare? Naturalmente basta pensare alla traduzione inglese del verbo per scoprire che il comando è DELE.

DELE 1
+OK Message deleted

Davvero questa riga di codice non ha bisogno di spiegazioni. Ad ogni modo vale la pena notare che se la connessione al server per qualche motivo si dovesse essere interrotta, il messaggio non potrebbe comunque essere cancellato. È necessaria una disconnessione completa dal server per poter effettuare la cancellazione.
E il reset? Naturalmente con il comando RSET.

RSET
+OK Reset state

Si può effettuare la ricezione solo di parte dei messaggi grazie al comando TOP. C'è da notare, però, che non tutti i servi di posta elettronica di tipo POP3 supportano questo comando ma quelli che lo fanno, permettono di lavorare come se stesse utilizzando parzialmente il comando RETR solo ulteriormente specificato.
Esempi di utilizzo sono:

TOP 1 0
+OK Top of message follows
--- all message headers ---

TOP 1 10
+OK Top of message follows
--- all message headers ---
E naturalmente, ultimo ma non ultimo, il comando QUIT. Indovinate un po' a cosa può servire?

Ci siamo!

Bene, ora che abbiamo fatto tutte le premesse vi mostro la procedura passo passo per iniziare a "giocare" con Internet delle Cose!

1) Create una casella di posta elettronica apposita, tramite uno dei tanti servizi gratuiti. L'unica cosa alla quale dovete fare attenzione è che il server supporti lo standard POP3 senza SSL. La mia scelta è ricaduta su www.email.it

2) Registratevi sul sito www.ifttt.com con l'email appena creata

3) Create le vostre attivazioni tramite i trigger disponibili nei vari canali. Tutti i trigger definiti dovranno generare sempre una sola action è cioè l'invio di una email alla vostra casella appena creata. Di seguito potete vedere come ho gestito le 3 attivazioni spiegate in questo articolo:

Potete quindi riprodurre queste 3 recipes ed utilizzare il software in allegato da inserire in FTPmicro per avere subito una dimostrazione di Internet delle Cose.

Questa è l'immagine del progetto:

Di seguito potete vedere LED1 e LED2 spenti:
(i due led che vedete accesi sono relativi ad FTPmicro, alimentazione e connessione ethernet)

E l'accensione del LED1 relativo al Buongiorno mattutino delle ore 9:00

Come detto sopra, potete facilmente sostituire i led con relè di potenza e quindi gestire praticamente qualsiasi apparato!

4) Ora è il momento di personalizzare! Create la vostra recipe su IFTTT impostando come action sempre la vostra email ed inserendo nell'oggetto il vostro messaggio di attivazione (ad esempio CALDAIA_ON). Lo stesso messaggio dovrà essere inserito nel firmware relativamente all'attivazione dell'uscita dove avrete appunto collegato la caldaia (esempio LED1 se l'avete inserita al posto del LED1).

Facile no? Di seguito alcuni commenti sul firmware che vi aiuteranno nella personalizzazione.

FIRMWARE

Il firmware è basato sullo stack tcp/ip fornito da Microchip. La struttura del software potrà sembrarvi abbastanza complessa, ma dopo averlo fatto girare sotto emulazione potete ben comprendere che era l'unico modo di realizzare un software così potente e completo su un microcontrollore ad 8bit con limitate risorse. Stiamo quindi parlando di gestione a stati finiti dove ogni volta si torna nel main facendo avanzare di uno step lo stato da processare, quindi senza rallentare le operazioni di trasmissione e ricezione dalla rete ethernet. Per i più esperti: si, ho semplificato molto, ma il senso è quello 😉

static BYTE ServerName[] =    "popmail.email.it"; //"212.97.34.54";
static WORD ServerPort = 110;

static ROM BYTE EmailUsername[] = "INSERITE L'EMAIL";
static ROM BYTE EmailPassword[] = "INSERITE LA PASSWORD";

La prima cosa da fare è inserire la vostra email e la password nelle rispettive variabili del file GENERICTCPCLIENT.C
Se poi utilizzate un servizio email diverso da email.it dovete anche inserire il relativo indirizzo. Vedi sopra.

	static enum _GenericTCPExampleState
	{
		SM_HOME = 0,
		SM_SOCKET_OBTAINED,
		SM_PROCESS_RESPONSE,
		SM_SOCKET_OBTAINED_USER,
		SM_PROCESS_RESPONSE_USER,
		SM_SOCKET_OBTAINED_PASS,
		SM_PROCESS_RESPONSE_PASS,
		SM_SOCKET_OBTAINED_STAT,
		SM_PROCESS_RESPONSE_STAT,
		SM_SOCKET_OBTAINED_RETR,
		SM_PROCESS_RESPONSE_RETR,
		SM_BUFFER_FLUSH_0,
		SM_BUFFER_FLUSH_1,
		SM_BUFFER_FLUSH_2,
		SM_BUFFER_FLUSH_3,
		SM_SOCKET_OBTAINED_DELE,
		SM_PROCESS_RESPONSE_DELE,
		SM_SOCKET_OBTAINED_QUIT,
		SM_PROCESS_RESPONSE_QUIT,
		SM_DISCONNECT,
		SM_DONE
	} GenericTCPExampleState = SM_DONE;

Sopra potete vedere gli stati creati all'interno del processo TCP Client. Sono facilmente riconoscibili i vari comandi POP3 e le relative risposte del server di posta remoto.
L'obiettivo è quindi quello di leggere l'email in arrivo e processarne il contenuto. Se il mittente è IFTTT allora si va avanti, altrimenti si cancella subito l'email. In caso positivo quindi si legge l'oggetto del messaggio e si procede con la relativa attivazione. Si cancella quindi il messaggio. Ci si disconnette dal server di posta, si attendono 30 sec. e poi si ricomincia.

		case SM_SOCKET_OBTAINED_RETR:
			// Wait for the remote server to accept our connection request
			if(!TCPIsConnected(MySocket))
			{
				// Time out if too much time is spent in this state
				if(TickGet()-Timer > 5*TICK_SECOND)
				{
					// Close the socket
					TCPDisconnect(MySocket);
					MySocket = INVALID_SOCKET;
					GenericTCPExampleState--;
				}
				break;
			}

			Timer = TickGet();
			
			// Make certain the socket can be written to
			if(TCPIsPutReady(MySocket) < 125u)
						break;


			TCPPutROMString(MySocket, (ROM BYTE*)"retr ");
			TCPPutROMString(MySocket, (ROM BYTE*)"1");  // n°messaggio
			TCPPutROMString(MySocket, (ROM BYTE*)"\r\n");

			// Send the packet
			TCPFlush(MySocket);

			GenericTCPExampleState++;

			break;

Sopra un esempio di invio comandi POP3 al server di posta remoto. Nello specifico è stato trasmesso RETR 1 (seguito da invio ed a capo)

		case SM_BUFFER_FLUSH_0:  // svuota buffer
			// Check to see if the remote node has disconnected
			if(!TCPIsConnected(MySocket))
			{
				GenericTCPExampleState = SM_DISCONNECT;
				// Do not break;  data in the TCP RX FIFO
			}
	
			// Get count of RX bytes waiting
			w = TCPIsGetReady(MySocket);	
	
			// Obtian and print the server reply
			i = sizeof(vBuffer)-1;
			vBuffer[i] = '\0';
			while(w)
			{
				if(w < i)
				{
					i = w;
					vBuffer[i] = '\0';
				}
				w -= TCPGetArray(MySocket, vBuffer, i);

				if(GenericTCPExampleState == SM_BUFFER_FLUSH_0)
					break;
			}
			

			if (strstrrampgm(vBuffer,(ROM BYTE*)"Subject")!=NULL) //Subject
			{
			if (strstrrampgm(vBuffer,(ROM BYTE*)"Buongiorno")!=NULL) //Buongiorno!
			{
			PopStatus[1] = 1; // Buongiorno -> attiva LED1 (impulso)
			}
			if (strstrrampgm(vBuffer,(ROM BYTE*)"LED2_ON")!=NULL) //led2_ON
			{
			PopStatus[2] = 1; // Led2_ON -> attiva LED2 (impulso)
			}
			if (strstrrampgm(vBuffer,(ROM BYTE*)"Freddo")!=NULL) //Freddo!
			{
			PopStatus[3] = 1; // Freddo! -> attiva LED1+LED2 (impulso)
			}
			}

			GenericTCPExampleState = SM_BUFFER_FLUSH_1;
			break;


Nell'immagine sopra potete vedere la risposta ricevuta in vBuffer[] e come viene processata, verificando quindi le varie stringhe: "Buongiorno","LED2_ON","Freddo".
Per ogni corrispondenza esatta viene attivato il relativo comando, settando dei bit di PopStatus[]

		case SM_DISCONNECT:
			// Close the socket so it can be used by other modules
			// For this application, we wish to stay connected,
                        //but this state will still get entered if the remote server decides to disconnect
			TCPDisconnect(MySocket);
			MySocket = INVALID_SOCKET;

			PopStatus[5] = 1;  //process i/o

			DelayMs(30000); // wait 30sec then re-read email

			GenericTCPExampleState = SM_DONE;
			break;

GenericTCPClient() termina con la disconnessione dal server di posta remoto. Viene quindi attivata la flag per attivare la funzione ProcessIO() e poi l'attesa di 30 secondi prima di una nuova connessione con relativa lettura e verifica di una nuova eventuale email.

Di seguito invece potete vedere una parte del main:

    while(1)
    {
        if(TickGet() - t >= TICK_SECOND)   // about 5  sec.
        {
            t = TickGet();

			GenericTCPClient();
        }

        // This task performs normal stack task including checking
        // for incoming packet, type of packet and calling
        // appropriate stack entity to process it.
        StackTask();
 
        // This tasks invokes each of the core stack application tasks
        StackApplications();

	// Process application specific tasks here.
	ProcessIO();

	}

Sopra il ciclo infinito del main dove ogni 5 sec. viene avviato un nuovo processo TCPclient, poi i successivi task relativi allo stack ed infine il ProcessIO. Quest'utlimo necessario per la gestione delle uscite e che vedremo di seguito.

static void ProcessIO(void)
{
 if (PopStatus[5] == 1) //process i/o
 {

	if (PopStatus[1] == 1) //Buongiorno!
	{
	LED1_IO = 1; // Buongiorno -> attiva LEDA (impulso)
	DelayMs(3000); // 3sec
	LED1_IO = 0; // disattiva LED1
	PopStatus[1] = 0;
	}
	if (PopStatus[2] == 1) //Led2_ON
	{
	LED2_IO = 1;// Led2_ON -> attiva LEDB (impulso)
	DelayMs(3000); // 3sec
	LED2_IO = 0; // disattiva LED2
	PopStatus[2] = 0;
	}
	if (PopStatus[3] == 1) //Freddo!
	{
	LED1_IO = 1;// Freddo! -> attiva LEDA+LEDB (impulso)
	LED2_IO = 1;
	DelayMs(3000); // 3sec
	LED1_IO = 0;// disattiva LED1+LED2
	LED2_IO = 0;
	PopStatus[3] = 0;
	}
 PopStatus[5] = 0;
 }
}

La funzione sopra si occupa di gestire le attivazioni in base al comando ricevuto che è rappresentato dai bit di PopStatus[]. Potete facilmente modificare il tempo di accensione DelayMs(3000); e modificare le uscite LED1_IO = 1;. Se aggiungete nuove uscite non dimenticate di dichiararle prima.

Non finisce qui!

Questo è solo l'inizio, infatti la straordinaria versatilità di questo progetto potrebbe essere limitata dal tempo di latenza di IFTTT che è di 15 minuti massimo. Sicuramente accettabile per una moltitudine di applicazioni ma per essere "più realtime" la gestione remota dovrà essere fatta con le API piuttosto che con le email. Ci lavoreremo in futuro e quindi continuate a stare sintonizzati su Elettronica Open Source!

Vi ricordo che FTPmicro è disponibile montato e collaudato nel nostro store, oppure potete realizzarlo da soli seguendo la documentazione indicata nell'articolo linkato all'inizio.

Come sempre rimango disponibile nei commenti per rispondere alle vostre domande e/o supportarvi con la vostra applicazione di Internet delle Cose!

 

Quello che hai appena letto è un Articolo Premium reso disponibile affinché potessi valutare la qualità dei nostri contenuti!

 

Gli Articoli Tecnici Premium sono infatti riservati agli abbonati e vengono raccolti mensilmente nella nostra rivista digitale EOS-Book in PDF, ePub e mobi.
volantino eos-book1
Vorresti accedere a tutti gli altri Articoli Premium e fare il download degli EOS-Book? Allora valuta la possibilità di sottoscrivere un abbonamento a partire da € 2,95!
Scopri di più

8 Comments

  1. Max Caruso 5 dicembre 2013
  2. Emanuele Emanuele 5 dicembre 2013
  3. GinoBerto 16 dicembre 2013
  4. MichelePennisi 19 dicembre 2013
  5. Emanuele Emanuele 19 dicembre 2013
  6. IvanScordato Ivan Scordato 10 gennaio 2014
  7. piergiorgio.moroni 15 gennaio 2014
  8. Massimo Spiezia Massimo.Spiezia 18 dicembre 2014

Leave a Reply

Flip&Click Arduino e Python compatibile

Fai un abbonamento Platinum (EOS-Book + Firmware), ricevi in OMAGGIO la nuova Flip&Click, inviaci il tuo progetto e OTTIENI IL RIMBORSO