Arduino: Domotica e Antifurto con Controllo Remoto e Notifica SMS Tramite Google Calendar

La possibilità di controllare Arduino da remoto e una delle applicazioni sulla quale ho maggiore interessa. Trovo che Arduino abbia una forte predisposizione alla domotica OpenSource o FaiDaTe ed è per questo motivo che cerco di scrivere degli Sketch orientati sull’aspetto di controllo degli attuatori da remoto.

Se ci inseriamo anche la possibilità di inviare allarmi o notifiche via email o via SMS senza dove per forza comprare un GSM Shield e senza costi aggiuntivi la cosa diventa ancor più allettante e aumenta di molto la tipologia di utilizzo di Arduino.

Rimanendo in ambiente domotica potremmo effettuare un allarme che avvisa con un SMS all’accadere di un determinato evento.

Questo esempio è quello che andrò a spiegare.

Come dicevo in precedenza, l’idea di avere da Arduino delle notifiche via SMS rapidi e veloci mi era sempre piaciuta. Il problema diventava l’acquisto di un GSM Shield. Ero arrivato al punto di smontare un vecchio Nokia 3210 per integrarlo con Arduino … capiraiii :| … come se fosse una cosa semplice e banale, come direbbero gli Afterhours :)

Lasciato alle spalle il progetto implementazione Nokia 3210 e Arduino mi stavo rassegnando ad utilizzare solo le notifiche via email, che dal mio punto di vista non sono il massimo della rapidità dato che con il mio smartphone faccio un controllo ogni ora e non ho assolutamente voglia di lasciare la connessione UMTS sempre attiva.

Un bel giorno mi venne in mente che il Signor Google mette a disposizione un servizio di notifica via SMS per gli eventi aggiunti sul proprio calendario condiviso. Ero arrivato alla soluzione … dovevo utilizzare Google Calendar

Il problema adesso diveniva il capire come far inserire l’evento di Arduino dentro Google Calendar e qui mi è venuto ad aiutare SalisNet.eu – Aggiungere un evento a Google Calendar che ha scritto un bell’articolo sulla possibilità si inserire eventi tramite un form HTML e PHP … era proprio quello che stavo cercando!!!

Fatti un idea di cosa può fare il progetto

Vedi l’articolo Go Arduino!!!

Iniziamo con la spiegazione pratica e i codici.

Di cosa abbiamo bisogno:

  • Buona conoscenza di PHP!!!
  • Server WEB (Apache e PHP) MySQL al momento non ci interessa, può essere utile per successive applicazioni.
  • 2 Account di Google o l’iscrizione a GoogleAPPS con 2 account di nostra proprietà.
  • Saper utilizzare Google Calendar ed aver attivato le notifiche di Google Calendar per il proprio cellulare.
  • Arduino + Ethernet Shield
  • Interruttore magnetico o altro tipo di attuatore, sensori e altri componenti elettrici vedi (Arduino con controllo remoto via HTTP)

Il codice di Arduino:

Descrizione pratica: Arduino rimane in ascolto di una stringa http che abbia come parte finale ATT=1 quando questo evento si verifica,  viene attivato “l’antifurto”. Con “antifurto” attivo, se si verifica un determinato evento sull’interruttore magnetico o qualunque altro attuatore, Arduino invia un GET con tutti i parametri ad una pagina PHP che elabora la richiesta.

...

/* ***
 controllare un attuatore via web
 con sensori di temperatura, luce e interruttore magnetico
 ed invivio di GET per la notifica dello status via SMS con Google Calendar
 ARDUINO UNO
 ETHERNET SHIELD
 by Gianni Favilli - www.giannifavilli.it
 Readme: http://www.cianaweb.it/blog/arduino-webcontrol-gcal-sms
 *** */

...

void loop(){

...

  /*inizio lettura switch*/
  valSwitch = digitalRead(inSwitch);  // legge il valore dell'input switch
  /*fine clacolo switch*/

  /*inizio attuatore led interruttore magnetico*/
  // accendo o spengo un led se l'interruttore viene aperto o chiuso
  if (valSwitch == HIGH) {
    digitalWrite(ledPinSwitch, HIGH);  // accende il LED dell'interruttore magnetico
    NotifyValSwitch = 1; // attiva il notificatore dell'interruttore magnetico
	// conta i cicli ad ogni loop per evitare l'invio di 'infiniti' sms
	// l'sms viene inviato solo quanto ContaCicliNotifica = 1 ovvero solo al primo loop
    ContaCicliNotifica = ContaCicliNotifica++;
  }
  else { // altrimenti
    digitalWrite(ledPinSwitch, LOW);  // spegne il LED dell'interruttore magnetico
    ContaCicliNotifica = 0;
    NotifyValSwitch = 0;
  }
  /*fine attuatore led interruttore magnetico*/

  // abilito il client-server per la lettura in ingresso della stringa http
  Client client = server.available();

  if (client) {
    boolean currentLineIsBlank. = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        leggoStringa.concat(c);
        if (c == '\n' && currentLineIsBlank) {
          if(leggoStringa.indexOf("ATT=1") > 0) { // controllo se nella stringa http in entrata finisce con ON
            // se e' ON
            digitalWrite(outPinRele, HIGH); // attiva rele'
            digitalWrite(ledPinNotify, HIGH); // attiva led
            Notifica = true; // attivo la notifica degli sms
            Serial.println("Notifiche ON");
          }
          else{
            // se e' OFF
            digitalWrite(outPinRele, LOW); // disattiva rele'
            digitalWrite(ledPinNotify, LOW); // disattiva led
            Notifica = false; // disabilito la notifica degli sms
            Serial.println("Notifiche OFF");
          }
          // COSTRUZIONE PAGINA HTML CHE RISPONDE SE LE NOTIFICHE SONO ATTIVE O MENO
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          // inizio HTML
          client.print("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
          client.println("<h1>STATO NOTIFICHE VIA SMS</h1>");
          client.println("<hr />");

          // scrivo lo stato di arduino (ON - OFF)

          if (Notifica) {
            client.println("<h2 style='color:green'>NOTIFICHE ATTIVE</h2>");
          }
          else
          {
            client.println("<h2 style='color:grey'>NOTIFICHE NON ATTIVE</h2>");
          }
          client.println("<hr /><a href='http://www.giannifavilli.it'><em>Visita GianniFavilli.it</em></a>");
		  client.println("<br /><a href='http://www.cianaweb.it/blog/arduino-webcontrol-gcal-sms'><em>Leggi l'Articolo Completo</em></a>");

          // termino l'html
          client.println("</body></html>");

          // svuoto la stringa per una successiva lettura
          leggoStringa="";
          // fermo il client in ingresso
          client.stop();

        } //if c == /n
      } // if client available
    } // while client connesso
  } // if client

  // controllo se le notifiche via sms sono attive,
  //se NotifyValSwitch è = 1 e se ContaCicliNotifica è = 1
  if(Notifica == true && NotifyValSwitch == 1 && ContaCicliNotifica == 1){
	Serial.println("invio il GET alla pagina PHP");
    // abilito il client per l'invio del GET
    Client client_send(serverphp,80);
    if (client_send.connect()) {
      //definisco il GET con i dati da inviare
      client_send.print("GET /pagina-che-ascolta..php?Board=ArduinoUNO&Location=Roma&");
      // invio il valore ContaCicliNotifica fondamentale per inviare gli sms
      // il php elabora la richiesta SSE Cicli=1 ovvero lavora solo il primo loop
      client_send.print("Cicli=");
...
Per avere lo sketch completo fai una donazione o contattami
Donazione per il manetenimento di questo blog



Se vuoi scrivi il motivo della donazione :



Perché? Semplicemente perché non ritengo giusto che il mio codice venga utilizzato da terzi per lucrare, facendo un semplice copia e incolla, mentre il sottoscritto ha dovuto impiegarci tempo, studio, know-how e fatica!!!

Se ciò non ti sembra giusto sei liberissimo di prendere visione del codice reso disponibile e studiarlo! ;)

Impostare Google Calendar:

Inanzi tutto dobbiamo predisporre di 2 Account di Google o se utilizziamo GoogleAPPS dobbiamo possedere 2 account che possiamo gestire in piena libertà.

L’account principale è quello dove andremo ad attivare le notifiche con SMS. Per farlo andate sulle Impostazioni Calendar.

Una volta attivate sempre dalle impostazioni abilitiamo la notifica via SMS degli Inviti agli Eventi. Per farlo, sempre dalle impostazioni andate su Calendari e cliccate su Notifiche del vostro calendario predefinito.

A questo punto l’account principale è pronto.

L’account secondario è quello con cui invieremo gli inviti ai nuovi eventi.

Per farlo è necessario condividere il nostro calendario con l’account principale, questa operazione può essere fatta dalle Impostazioni Calendar.

Quando create la condivisione del calendario con l’account principale consiglio di abilitare i permessi di modifica degli eventi.

Una volta accettato l’invito della condivisione tra l’account principale e quello secondario siamo pronti per configurare i file PHP.

La parte in PHP:

Come dicevo prima, grazie ad un articolo letto su SalisNet.eu sono riuscito ad inserire i nuovi eventi su GoogleCalendar senza per forza dover accedere tramite browser a Gcal. L’articolo sopra riportato spiega come inserire un nuovo evento su Gcal sutilizzando semplicemente un Form in HTML.

Presi i file necessari messi a disposizione da SalisNet.eu ho dovuto apportare alcune modifiche fondamentali al funzionamento dell’invio dei dati a Google Calendar. Questi sotto riportati sono i file in PHP di cui necessitiamo con la descrizione delle modifiche da fare.

pagina-che-ascolta.php

Il codice che segue deve essere inserito in un file nominato pagina-che-ascolta.php cambiate pure nome ma ricordate di modificare anche lo SKETCH di Arduino quando viene inviato il GET.

Descrizione: Questo file controlla se alla pagina viene inviato un GET in caso affermativo controlla se la variabile Cicli=1 questo controllo è fondamentale per evitare di inviare la notifica ogni volta che il loop viene lavorato. A questo punto viene inviato il report tramite il file GoogleCalendarWrappeNotifier.php che spieghero successivamente.

In caso non ci sia un GET che fa richiesta della pagina, aprendo questa con un browser web abbiamo la possibilità di ATTIVARE o DISATTIVARE le notifiche con l’utilizzo di un FORM HTML ricordate di modificare l’ACTION del form indicando l’indirizzo IP di Arduino.

<?php

// controllo sull'invio da form

if(!empty($_GET)) // controllo se ho un GET altrimenti costruisco l'html
{

// controllo se e' il GET giusto con notifica attiva e ciclo = 1
	if($_GET["Cicli"]==".1")
	{

$contenuto = "*** INIZIO RAPPORTO ***\n\n";
foreach ($_GET as $key => $value)
...
$contenuto .= "\n*** FINE RAPPORTO ***";

//elaboro ora
$dataevento = date("Y-m-d");
$tempoevento = date("H:i:s");

// inclusione del file di classe
@require_once("GoogleCalendarWrappeNotifier.php");

// istanza della classe
// inserire username e password dell'account di google
$gc = new GoogleCalendarWrapper("UserAccountSecondarioGoogle@google.com", "passworddigoogle");

// parametri per l'inserimento
$evento = array();
$evento["title."] = filter_var($_GET["Board"], FILTER_SANITIZE_STRING);
$evento["content"] = filter_var($contenuto, FILTER_SANITIZE_STRING);
$evento["where"] = filter_var($_GET["Location."], FILTER_SANITIZE_STRING);
$evento["startDay"] = filter_var($dataevento, FILTER_SANITIZE_STRING);
$evento["startTime"] = filter_var($tempoevento, FILTER_SANITIZE_STRING);
$evento["endDay"] = filter_var($dataevento, FILTER_SANITIZE_STRING);
$evento["endTime"] = filter_var($tempoevento, FILTER_SANITIZE_STRING);

// chimata al metodo per l'inserimento
if($gc->add_event($evento)){

   // notifica in caso di inserimento

}else{

   // notifica in caso d'insuccesso

  }

	} // if get giusto
} // if(!empty($_GET))
	else
{
	//scrivo l'html per controllare le notifiche di arduino
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="author" content="Gianni Favilli" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Arduino WEBCONTROL con GoogleCalendar SMS Notifier by GianniFavilli.it</title>
</head>

<body>
<h1>NOTIFICHE</h1>
<form method="get" action="http://indirizzo-o-ip-arduino" name"attivatore">
  <label>
    <input type="radio" name="ATT" id="on" value=".1" />
    ATTIVA</label>
      <label>
    <input type="radio" name="ATT" id="off" value="0" />
    DIATTIVA</label>
    <input type=submit value="Invia Comando">
</form>
<p> </p>
<p><a href='http://www.giannifavilli.it'><em>Visita GianniFavilli.it</em></a> o
<a href='http://www.cianaweb.it/blog/http://www.cianaweb.it/blog/arduino-webcontrol-gcal-sms'><em>Leggi l'Articolo Completo</em></a></p>
</body>
</html>
Per avere il codice php completo contattami prima di fare una donazione
Donazione per il manetenimento di questo blog



Se vuoi scrivi il motivo della donazione :



Perché? Semplicemente perché non ritengo giusto che il mio codice venga utilizzato da terzi per lucrare, facendo un semplice copia e incolla, mentre il sottoscritto ha dovuto impiegarci tempo, studio, know-how e fatica!!!

Se ciò non ti sembra giusto, sei liberissimo di prendere visione del codice reso disponibile e studiarlo! ;)

GoogleCalendarWrappeNotifier.php

Per utilizzare questo sistema abbiamo bisogno di 2 classi. La prima è questa che segue, alla quale ho apportato delle modifiche fondamentali all’utilizzo delle notifiche con Arduino.

Questo file deve essere nominato GoogleCalendarWrappeNotifier.php

Attenzione alla Riga 35, dovete modificare il valore tra virgolette, inserendo l’indirizzo email del vostro account primario, quello dove avete attivato le notifiche via SMS quando venite invitati ad un nuovo evento.

MyCurl.php

L’ultima classe da utilizzare è MyCurl.php la potete scaricare da SalisNet.eu modificando l’estensione del file da TXT a PHP.

Attenzione: per far funzionare questa classe sul server PHP deve essere attiva l’estensione php_curl.

Conclusioni:

Per concludere, con qualche conoscenza in PHP ci possiamo sbizzarrire per l’invio di notifiche via email o via SMS se la temperatura supera una certa soglia se la luminosità della stanza varia o se qualunque attuatore cambia di stato.

Per far questo basta modificare il GET di Arduino e il file pagina-che-ascolta.php.

Screenshot del mio smartphone per il controllo remoto di Arduino

Potremmo anche agganciare un DataBase in MySQL per registrare gli eventi e avere delle tabelle che ci permetto di fare operazioni dinamiche in base ai valori inviati dal GET di Arduino.

Per la precisione con MySQL possiamo registrare l’ultimo stato di Arduino, dato che il povero Arduino cambia stato in base alla stringa http che gli arriva. Mentre se avessimo un DB potremmo registrare l’ultimo stato di Arduino.

Qui a sinistra uno screenshot della pagina web per il controllo remoto di Arduino.

Questo è stato possibile grazie all’utilizzo di un database MySQL. E’ possibile farlo anche con un file di testo, ma risulta complicato avere uno storico delle variazioni di stato di Arduino. La pagina-che-ascolta.php oltre a controllare la variazione di stato per l’invio delle notifiche può “parsare” i dati provenienti da Arduino tramite GET ed eseguire un INSERT INTO dentro il database MySQL. Una nuova pagina PHP legge i dati recuperandoli da MySQL ed ecco fatta la pagina web per il  controllo remoto di Arduino, come potete vedere qui a fianco.

Comunque le applicazioni sono una moltitudine, dalla possibilità di utilizzare dei JavaScript a quella di implementare le funzioni della pagina-che-ascolta.php … c’è da sbizzarrirsi ;)

Reference:

Il Forum di Arduino ARDUINO Forum in particolare il Topic da me aperto Inviare dati a PHP e ricevere comandi via HTTP in un unica sessione ringraziando lesto e Marco Benini per l’aiuto.

Le classi PHP originali e NON modificate (quindi INUTILIZZABILI per questo progetto) per l’inserimento di Eventi in Google Calendar le potete reperire a questo indirizzo SalisNet.eu – Aggiungere un evento a Google Calendar.

La guida utilizzata per le modifiche al file GoogleCalendarWrappeNotifier.php è quella ufficiale che fornisce GoogleCODE e la potete reperire al seguente link se volete aggiungere opzioni alle vostre notifiche Google Data Protocol – Common Elements: “Kinds”.

Un po’ di consulenza PHP che non fa mai male, PHP: Hypertext Preprocessor.

Come sempre rimango a disposizione per commenti, chiarimenti, informazioni, perplessità, modifiche da voi apportate, problemi o errori.

Donazione per il manetenimento di questo blog



Se vuoi scrivi il motivo della donazione :



3 Comments

  1. Ciao,
    sono poco pratico di arduino visto che da poco mi interesso ala cosa che devo dire ha notevoli potenzialità. putroppo la poco conoscenza della materia mi porta ad essere impreparato a cosa per altri scontate.
    solo una cosa ti chiedo, le parti in PHP dove vanno messe?
    grazie e complimenti per gli ottimi progetti!
    Damiano

    Reply

Leave a Comment.

Prima di pubblicare, dimostra di non essere uno spammer.

Scrivi la parola: blog