jeudi 22 novembre 2012

Google Apps Script : interagir facilement avec les produits google

 Récemment le forum de domotique Abalava a expliqué comment utiliser les scripts Google pour pouvoir se faire envoyer un SMS sur une action précise, ici la réception d'un mail provenant d'une installation domotique.

Je me suis donc penché un peu sur cette fonctionnalité proposée par Google et je suis agréablement surpris par tout ce qu'il est possible d'en faire !

Tout se fait depuis google Drive en créant un nouveau script (Créer/Plus).
A partir de là vous pouvez appeler ultra simplement les API Google de plusieurs services.

Dans ce billet je ne parlerais que des API Gmail et Agenda pour vous montrer ce que l'on peut en faire.






En ayant lu la présentation d'Abalava je me suis dit, tient si j'utilisais ces scripts pour gérer mes webcam IP et pourquoi pas mon répondeur fixe + mobile.


Après avoir tout tourné dans tous le sens voici ce que j'ai décidé :

  • Avoir un Agenda nommé 'Maison' en plus de mes autres agendas qui est configuré pour envoyer des SMS lors des évènements.
  • Enregistrer dedans chaque démarrage de chaque WebCam IP.
  • Enregistrer dedans et m'envoyer un SMS sur chaque alerte déclenchée par une WebCam IP.
  • Enregistrer dedans chaque appel en absence et message sur le répondeur de mon portable.
  • Enregistrer dedans chaque appel en absence et message sur le répondeur de mon fixe.

Voici mes flux de données et comment les scripts vont agir :

Caméras IP (FOSCAM FI8918W et FI8910W )

Au démarrage chaque webCam envoie un mail pour signaler qu'elle est active.
En cas de déclenchement du capteur de mouvement intégré, chaque caméra envoi un mail avec des photos en pièce-jointe.
Un filtre automatique Gmail rajoute un libellé "Foscam" à ces mails.
Le script, chaque minute, vérifie ces mails, (in:inbox is:unread label:Foscam) et en cas d'alarme créé un évènement avec rappel par SMS une minute avant l'heure réelle donc envoie du SMS immédiat et en cas d'alarme et se contente de créer un évènement sans SMS pour un simple (re)démarrage des caméras.
Le mail est conservé puis passé comme lu.

Appel en absence et répondeur téléphone fixe

Orange envoi un mail sur ma  boîte Orange récupérée par Gmail lorsque qu'il y a un appel en absence ou un message sur le répondeur du fixe.
Le script vérifie toute les heures la présence d'un tel mail non lu (in:inbox from:(noreply@orange-ftgroup.com) subject:message -{label:répondeur}) et lui rajoute un libellé "Répondeur" après avoir transformé ce mail en évènement dans l'agenda "Maison".
Pour connaîte l'heure exact de l'appel qui est transmis dans le corps du message, on parse ce dernier afin de créer le rappel à la bonne heure.


Pour information, voici la liste des paramètres utilisables en tant que recherche avancée dans les mails : lien du site Nikopik.

Scripts créés

Caméra (xxxxxxx est l'identifiant exact de mes caméras)

//***********************************//
// Gestion mail start cam + alertes  //
//***********************************//

function Foscam() {

//Recherche non lus foscam
var threads = GmailApp.search('in:inbox is:unread label:Foscam');
    
for(i in threads){
    
    //Mise à read au début
    threads[i].markRead();
    
    var nomCam = '';
    var objet = threads[i].getFirstMessageSubject();
    
  
    //Cam Blanche
    if (objet.indexOf('xxxxxxxxx') > 0 ) {
      nomCam = 'Cam Blanche'
    }
    
    //Cam Noire
    if (objet.indexOf('xxxxxxxx') > 0 ) {
      nomCam = 'Cam Noire'
    }
    

    //Envoi du sms si alarme sinon juste event
    if (objet.indexOf('motion alarm') > 0 ) {
      SendAgenda('Alarme '+nomCam, nomCam, true);
      }
    else {
      SendAgenda('Démarrage '+nomCam, nomCam, false);
    }
 }
}



Répondeur

//***********************************//

//     Gestion répondeur Orange      //
//***********************************//

function RepondeurOrange() {
  //Recherche non lus d'orange sans label répondeur
  var threads = GmailApp.search('in:inbox from:(noreply@orange-ftgroup.com) subject:message -{label:répondeur}');

  for(i in threads){
  
    //Application du label Répondeur
    var label = GmailApp.getUserLabelByName('Répondeur');
    label.addToThreads(threads);
    
    //sujet
    var objet = threads[i].getFirstMessageSubject();
    
    //Corps du mail
    var message = threads[i].getMessages()[0].getBody();
    
    //parse du body pour avoir date/heure de l'appel
    var splitDate = message.split('le ')[1];
    var splitHeure = message.split('à ')[1];
    var dateTel = new Date();
    dateTel.setDate(splitDate.substring(0,2));
    dateTel.setMonth(splitDate.substring(3,5)-1);  //mois de 0 à 11 en javascript !!!!!
    dateTel.setYear(splitDate.substring(6,10));
    dateTel.setHours(splitHeure.substring(0,2));
    dateTel.setMinutes(splitHeure.substring(3,5));
    
    //Envoi dans l'agenda
    SendAgenda(objet, 'Tel Fixe', false, message , dateTel);
  }

}


Transformation en évènement Agenda

//***********************************//

//  Enregistrement dans l'agenda     //  // message et dateAgenda sont optionnels//
//***********************************//

function SendAgenda(titre, lieu, sms, message, dateAgenda) {
  //agenda maison
  var cal = CalendarApp.getCalendarsByName('Maison')[0];
  
    
  //Calcul de l'heure si non précisée et passage en date objet
  if(dateAgenda == undefined){
dateAgenda = new Date().getTime();
}
   else {
       dateAgenda = new Date(dateAgenda).getTime()
   }
  

  //Ajout des events
  if (sms == true) {
    cal.createEvent(titre, new Date(dateAgenda+60000), new Date(dateAgenda+60000), {location:lieu}).addSmsReminder(0);
  }
  else
  {
    cal.createEvent(titre, new Date(dateAgenda+60000), new Date(dateAgenda+60000), {location:lieu, description:message});
  }


}


Le script pour le téléphone portable est sensiblement le même à la différence que c'est l'objet du mail qu'il faut parser et non son corps.

A vos scripts !

Aucun commentaire:

Enregistrer un commentaire