PAW : Réception de SMS et appel d’une API en HTTP5 minute(s) de lecture

Après avoir vu dans le dernier article concernant le serveur PAW à installer sur un Smartphone Android comment on pouvait faire pour permettre de recevoir des SMS et de les utiliser comme déclencheur d’actions, nous aborderons aujourd’hui le moyen de transmettre ces ordres reçus par SMS en HTTP à une API.  L’API peut être celle d’un service sur Internet ou bien encore cette d’une box domotique.

Présentation

Quel est le but dernière tout cela?  Pouvoir piloter sa domotique via SMS par exemple.  Ou encore pouvoir questionner sa domotique par SMS afin d’obtenir une information tels des relevés de consommation ou de température à la demande.

Cela peut être pratique également afin de pouvoir agir à distance sur sa domotique si la connexion internet est HS. En cas de panne Internet, pour les box ou serveurs domotiques qui proposent des API locales (c’est à dire sans faire appel à un serveur distant), elles pourront être quand même contactées.  L’application PAW sert alors de pont entre l’extérieur (via les SMS) et votre réseau local à destination de votre serveur domotique (via des requêtes HTTP).

Une exécution en plusieurs commandes

Dans le précédent article concernant PAW et la réception des SMS nous avions vu qu’il suffisait d’enregistrer la demande de PAW à recevoir les SMS reçu par le Smartphone sur lequel il est installé via les commandes du style:

SmsListener.registerScript("test", "vibrate(3000);");

ou bien :

SmsListener.registerAction("Voix", "123", "vibrate(3000);");

Que l’on utilise des SMS Actions ou bien des SMS Scripts la commande à exécuter lors de la réception du SMS est le dernier paramètre à savoir dans mon exemple : “vibrate(3000);” ce qui signifie faire vibrer le téléphone pendant 3 secondes.

Souvent lorsque l’on veut faire parler 2 systèmes la mise en relation tient en plus de 1 commande.  Sinon se serait trop simple!  La solution proposée consiste alors à utiliser comme commande à exécuter le fait de dire : merci de se reporter à ce fichier là, il contient le script à exécuter.  Si le fichier de script se nomme “appelapi.bsh” et se trouve dans le répertoire “/sdcard/paw/import” on aura alors la syntaxe suivante:

SmsListener.registerScript("test", "source(\"/sdcard/paw/import/appelapi.bsh");\");

ou bien :

SmsListener.registerAction("Voix", "123", "source(\"/sdcard/paw/import/appelapi.bsh\");");

Le fichier contenant ce bout de code sera toujours à placer dans le répertoire “autostart” de PAW.  Quant au fichier appelapi.bsh sera à mettre dans le répertoire “import” de PAW.  Le nom de ce répertoire “import” est libre et peut être modifié à votre convenance.

Mise en œuvre

Voici la marche à suivre que je vous propose afin de permettre à PAW de recevoir les SMS reçus par le Smartphone-Serveur, de les décoder et d’appeler une API et HTTP.

  • Lancer la console d’administration de PAW sur votre ordinateur et connectez-vous sur PAW
    Via Média=> File Manager, créer le répertoire import (tout en minuscule) dans le répertoire /sdcard/paw/.

  • Paramétrer votre Smartphone pour que PAW puisse autoriser les scripts d'”autostart” comme présenté dans le précédent article
  • Copier le code suivant afin de créer un fichier appelapi.bsh
// pour l'appel d'URL
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.*;
import org.apache.http.client.methods.*;
import org.apache.http.util.*;

//déclarations pour les SMS
import de.fun2code.android.pawserver.util.*;

retour="";
getURL="";

//si utilisation des SMS Actions:
message = smsArgs.toLowerCase();
//si utilisations des SMS Scripts:
//message = smsMessage.toLowerCase();

// déterminataion de l'action à lancer
if (message.equals("lumière salon on")) {
//********** eedomus ********
//  getURL="http://api.eedomus.com/set?action=periph.value&api_user=aaaaa&api_secret=bbbbb&periph_id=12345&value=100";
//********** zibase *********
  getURL="http://192.168.0.2/cgi-bin/domo.cgi?cmd=ON+A3+P9";

    retour = "La lumière du salon est allumée.";
}
if (message.equals("lumière salon off")) {
//********** eedomus *********
//  getURL="http://api.eedomus.com/set?action=periph.value&api_user=aaaaa&api_secret=bbbbb&periph_id=12345&value=0";
//********** zibase **********
  getURL="http://192.168.0.2/cgi-bin/domo.cgi?cmd=OFF+A3+P9";

    retour = "La lumière du salon est éteinte.";
}

//lancement de l action
if (getURL.equals("")) {
  retour ="Désolé ça ne marche pas";
}
else {
  client = new DefaultHttpClient();

  get = new HttpGet(getURL);
  responseGet = client.execute(get);
  resEntityGet = responseGet.getEntity();

  if (resEntityGet = null) {
    retour = "Impossible de contacter le serveur.";
  }
//retirer le commentaire pour obtenir la réponse du serveur
  //retour = EntityUtils.toString(resEntityGet);
}

// envoi par SMS de l'accusé de réception 
SmsUtil.sendSms(smsNumber, retour);

Pensez à dé-commenter les lignes correspondantes aux appels Zibase ou eedomus en fonction du type de serveur que vous possédez.  Vous pouvez bien évidemment utiliser ce code afin d’appeler tout autre API en HTTP en l’adaptant en conséquence.  Pensez également à renseigner les bonnes valeurs des paramètres des API en fonction de vos identifiants.  La documentation de l’API pour la Zibase et la documentation de l’API de la box eedomus sont disponibles sur le site de leurs fabricants respectifs.

  • Placer le fichier créé et modifié pour votre besoin dans le répertoire /sdcard/paw/import.
  • Copier le code suivant afin de créer un fichier initsms.bsh que vous placerez dans le répertoire /sdcard/paw/autostart
import de.fun2code.android.pawserver.listener.*; SmsListener.registerAction("SMS", "123", "source(\"/sdcard/paw/import/appelapi.bsh\");");
  • Via le Smartphone, arrêter PAW et redémarrez-le à nouveau en appuyant sur le bouton STOP puis START.

Vous êtes fin prêts à piloter votre domotique par SMS.  Vous n’avez plus qu’à :

  • envoyer le SMS “SMS:123:lumière salon on” pour allumer la lumière
  • envoyer le SMS “SMS:123:lumière salon off” pour l’éteindre

Faites attention aux majuscules/minuscules dans vos SMS.  Si vous ne respectez pas la casse votre action ne marchera pas

Dans mon exemple j’ai utiliser la méthode SMS Action mais le principe est identique si vous optez pour les SMS Scripts.

Conclusion

Cet exemple fonctionne avec n’importe quelle API en HTTP.  Parmi les systèmes domotique que je possède à la maison, la Zibase remporte la palme de la sécurité car l’appel de l’API peut être faite en local sur votre box et non pas uniquement sur les serveurs distant de Zodianet.  Avec ce moyen on pourra commander directement des actionneurs mais également appeler des scénarii.

Le fait de devoir “ouvrir” manuellement les actions possibles via SMS en les renseignant un à un dans le script n’est pas forcément ennuyeux: on ne veut pas forcément tout faire par SMS.  Il faudra déjà se souvenir de la liste des commandes programmées…

Si vous possédez un Smartphone d’occasion à recycler en serveur PAW, le coût de la solution sera très abordable car le logiciel étant gratuit (vous pouvez néanmoins faire un don au programmeur pour le remercier), seul l’abonnement téléphonique sera à souscrire.  Vous trouverez très facilement sur le marché un forfait SMS illimités pour 2€ par mois. C’est vraisemblablement un solution très abordable que 24€ par an.

Le fait de pouvoir envoyer des SMS à sa domotique ouvre des portes pour les propriétaires de téléphones Apple équipés de l’application Siri.  Il vous suffit de renseigner le numéro de téléphone de votre passerelle PAW dans votre iPhone (comme un contact classique en fait) puis de demander à Siri d’envoyer un SMS à ce contact avec votre ordre comme message.  Vous pourrez donc piloter votre maison à la voix par ce biais!

7 Comments

  1. SRG said:

    Suite aux articles publiés ici, je me suis dégotté un vieux smartphone basique (un Samsung Galaxy Y) sur lequel j’ai en effet installé un serveur PAW : çà fonctionne très bien.

    En alternative à Free, je suis passé chez B&You qui me semble encore + intéressant : une SIM prépayée à 5€ à l’achat initial, un rechargement quelconque (par ex. 10€) = un numéro de téléphone et un crédit valable sans aucune expiration. Les SMS sont alors facturés 5cts par envoi (et il faut passer au moins 1 appel payant ou envoyer 1 SMS dans l’année pour garder la ligne active). Pour un système domotique qui n’enverra dans mon cas, que peu de SMS à l’année, çà me semble encore + adapté.

    22 février 2013
    Reply
    • Avatar photo Hervé said:

      C’est effectivement une alternative qui a du sens.

      24 février 2013
      Reply
  2. laumonier said:

    bonsoir

    encore merci pour l’ensemble de ces tutos.

    par contre, j’ai besoin d’un peu d’aide : je souhaiterais récupérer sur ma zibase les sms envoyés par le tacker de ma voiture. malheureusement le format des mail envoyés est fixe, je suis donc obligé d’utiliser le format registerScript.
    c’est la que ca coince, j’ai modifier le script mais je n’ai pas de résultat probant.
    Qui pourrait m’aider ??

    Merci d’avance
    nicolas

    17 juin 2013
    Reply
  3. razowski said:

    Bonjour,

    Ayant suivi à la lettre le tutoriel, je rencontre un souci avec la ligne :

    responseGet = client.execute(get);

    Il n’exécute pas la requête alors que tout le reste est identique à votre code et que j’ai mis des points de contrôle et que le reste est en ordre.

    Auriez-vous une idée du pourquoi du comment ?

    Merci

    1 novembre 2013
    Reply
  4. jgou78 said:

    bonjour,

    Même chose pour moi. Tous à l’air de fonctionner sauf l’envoie de la requete http ! help !

    4 mai 2014
    Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain: * Time limit is exhausted. Please reload CAPTCHA.