Piloter ma maison par SMS via Domoticz

Article ambitieux aujourd’hui car le but va être de  décrire la mise en place d’outils destinés à nous permettre de piloter notre domotique via SMS.

Le simple envoi d’un SMS contenant des mots clés prédéfinis (actions) déclenchera des actions dans Domoticz.

Prérequis.

  • Un téléphone Android équipé d’une carte téléphonique et d’un forfait SMS.
  • L’appli SMS Gateway Ultimate installée sur le téléphone.
  • Un Domoticz en état de marche.
  • Du temps, de l’application et de la patience. 😆

Principe de fonctionnement.

L’idée est que sur l’envoi d’ un SMS contenant un mot clé à notre téléphone Android passerelle, le SMS sera « donné à manger » à Domoticz par l’ intermédiaire dune variable qui déclenche un script Lua qui contient les actions à effectuer. Chaque action est reliée à un dispositif Domoticz.

Un joli schéma pour « mieux » visualiser ?.

pilotage_sms_domoticz

j’ai pas fait beaux arts.

La rédaction de cet article à été rendue possible par le travail d’un contributeur régulier du forum : Vil1driver que je tenais à remercier ici.

Vous trouverez son post initial à l’adresse suivante : https://easydomoticz.com/forum/viewtopic.php?f=17&t=596

Configuration Domoticz

Création d’une variable utilisateur

Dans le menu de paramétrage -> « Réglages »/ »Plus d’options »/ »Variables utilisateurs »

Ajouter une variable CHAINE nommée sms et contenant le mot ready. J’insiste sur le nom de la variable en minuscules.

variable_sms

Validez puis notez le numéro Idx associé à cette variable.

Installation et configuration, de l’appli SMS Gateway Ultimate

SMS Gateway Ultimate

La première partie qui consiste à donner un nom et un port TCP à cette appli est décrite ici https://easydomoticz.com/une-plateforme-sms-a-laide-dun-vieux-telephone-android-pour-domoticz-2/

Nous allons maintenant utiliser le menu « Rules » de  SMS Gateway Ultimate pour ajouter une règle de redirection d’un SMS entrant vers Domoticz.

Il s’agit de remplir le champ « Forward to url » tout en bas avec ce qui suit (que vous adapterez bien, sur à votre config)

http://USER:PASS@IP:PORT/json.htm?type=command&param=updateuservariable&idx=IDX&vname=sms&vtype=2&vvalue=%body%;%from%

Avec :

  • USER: votre nom d’utilisateur (si nécessaire)
  • PASS: votre mot de pass (si nécessaire)
  • IP: ip de domoticz
  • PORT: port de domoticz
  • IDX: idx de la variable utilisateur ‘sms’

sms_to_domoticz

Avant d’aller plus loin vérifions si cela fonctionne correctement.

Premiers tests

Validez tout cela, puis lancez le serveur SMS Gateway Ultimate par le bouton « Start »

A l’aide d’un autre téléphone, envoyez un SMS à votre plateforme SMS avec un texte quelconque dedans.

Sur SMS Gateway Ultimate, tout en bas , tirez l’onglet vers le haut pour voir les logs en temps réel.

sms_to_domoticz_logs

On peut voir l’arrivée du message et la redirection vers notre IP:port.

Vérifiez dans Domoticz que votre variable sms contienne bien votre SMS;lenuméroappelant (message et numéro sont séparés par un point virgule)

SMs_send_tovariable_domoticz

Mise en place du script Lua.

Que fait ce script ?

Il s’exécute dés que la variable nommé sms est modifiée, il recherche si le numéro appelant est dans la liste autorisée, puis exécute l’action mentionnée dans le message SMS envoyé.

Si l’action réussit un message SMS est renvoyé à l’appelant pour le notifier de  l’action effectuée, sinon des SMS sont renvoyés sur utilisateur non autorisé, commande inconnue.

 

Créez un fichier script_variable_sms.lua dans domoticz/scripts/lua contenant ce qui suit :

-- script_variable_sms.lua
--
-- un smartphone connecté au réseau wifi de la maison
-- avec l'application 'sms gateway ultimate' installée
-- https://play.google.com/store/apps/details?id=com.icecoldapps.smsgatewayultimate
--
-- dès qu'un sms est reçu, l'application met à jour une variable utilisateur nommée 'sms' via la requette json suivante
-- http://USER:PASS@IP:PORT/json.htm?type=command&param=updateuservariable&idx=IDX&vname=sms&vtype=2&vvalue=%body%;%from%
--
-- dès que la variable 'sms' est modifiée, ce script est exécuté.
-- suivant une correspondance avec l'un des messages de la liste ci dessous,
-- si la personne y est autorisée,
-- l'action associée est lancée
--
-- un message de réponse est retourné
--
-- la commande 'Help' retourne un SMS contenant la liste
--

--------------------------------
------ Tableau à éditer ------
--------------------------------

-- liste des messages à comprendre et leurs actions associées
local liste={}
--liste['message'] = "action"
liste['Help'] =          [[   reponse = sendAll()   ]]   -- ne pas toucher cette ligne
liste['Temp salon'] =       [[   reponse = 'Il fait '..string.sub(otherdevices_svalues['salon'],1,4)..'°C dans le salon'   ]]
liste['Temp chambre'] =    [[   reponse = 'Il fait '..string.sub(otherdevices_svalues['chambre'],1,4)..'°C dans la chambre'   ]]
liste['Temp sdb'] =       [[   reponse = 'Il fait '..string.sub(otherdevices_svalues['salle de bain'],1,4)..'°C dans la salle de bain'   ]]
liste['Temp'] =          [[   reponse =    'Salon : '..string.sub(otherdevices_svalues['salon'],1,4)..'°C'..'\n'..
                                 'Chambre : '..string.sub(otherdevices_svalues['chambre'],1,4)..'°C'..'\n'..
                                 'Salle de bain : '..string.sub(otherdevices_svalues['salle de bain'],1,4)..'°C'   ]]
liste['Temp ext'] =       [[   reponse = 'Il fait '..string.sub(otherdevices_svalues['exterieur'],1,4)..'°C dehors'   ]]
liste['Douche'] =          [[   commandArray['douche'] = 'On'
                        reponse = 'Je mets le salle de bain en chauffe'   ]]
liste['Tout éteindre'] =    [[   commandArray['Group:toute la maison'] = 'Off'   ]]
liste['Chauffage'] =       [[   commandArray['mv salon'] = 'On'   ]]
liste['Café'] =          [[   commandArray['la cafetiere'] = 'On'
                        reponse = 'Café en préparation'   ]]   
liste['Alarme on'] =       [[   commandArray['SecPanel'] = 'Arm Away'
                        reponse = 'Alarme activée dans 30s'   ]]
liste['Alarme off'] =       [[   commandArray['SecPanel'] = 'Disarm'
                        reponse = 'Alarme désactivée'   ]]
liste['Spoon'] =          [[   os.execute('/home/vil1driver/domoticz/scripts/lua/spoon.sh') ]]
liste['Cpu'] =             [[   reponse = 'Charge processeur : '..otherdevices_svalues['CPU_Usage']..'%' ]]
liste['Pc on'] =          [[   commandArray['windows on'] = 'On' ]]
liste['Pc off'] =          [[   commandArray['windows off'] = 'On'
                        reponse = 'Arrêt en cours'   ]]
liste['Ya qqn'] =         [[   function timedifference(d)
                           s = otherdevices_lastupdate[d]
                           year = string.sub(s, 1, 4)
                           month = string.sub(s, 6, 7)
                           day = string.sub(s, 9, 10)
                           hour = string.sub(s, 12, 13)
                           minutes = string.sub(s, 15, 16)
                           seconds = string.sub(s, 18, 19)
                           t1 = os.time()
                           t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
                           difference = os.difftime (t1, t2)
                           return difference
                        end
                        if (timedifference('mv salon') + 120) > timedifference('la porte') and (timedifference('mv chambre') + 120) > timedifference('la porte') then
                           reponse = 'Non, il n\'y a plus personne depuis '..os.date("!%X",timedifference('la porte'))
                        else
                           reponse = 'Oui, il y a du monde'
                        end      ]]                              

-- liste des utilisateurs autorisés
local user={}
user['papa'] = '+336xxxxxxx'
user['maman'] = '+336xxxxxxx'
-- etc..      

-- paramètres du serveur SMS Gateway Ultimate   
local gateway = 'http://192.168.1.66:59594'      -- url du serveur sms gateway

-- réponses par défaut
local good = 'Ok..'                                 -- réponse en cas de commande correcte
local notGood = 'Je ne comprends pas, essayez \'Help\''      -- réponse en cas de commande non comprise
local guess = 'Je ne vous connais pas !'               -- réponse aux utilisateurs non autorisés

--------------------------------
-- Fin du tableau à éditer --
--------------------------------

function spairs(t)
    local keys = {}
    for k in pairs(t) do keys[#keys+1] = k end
   table.sort(keys)
   local i = 0
   return function()
      i = i + 1
      if keys[i] then
         return keys[i], t[keys[i]]
      end
   end
end

function url_encode(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w %-%_%.%~])",
        function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
  end
  return str   
end

function sendAll()
   for message, action in spairs(liste) do
      if message ~= 'Help' then
         if rst == nil then
            rst = message
         else
            rst = rst..'\n'..message
         end
      end      
   end
   return rst
end

commandArray = {}

if(uservariablechanged['sms']) then
   sms,from = uservariables['sms']:match("([^;]+);([^;]+)")
   local msg = "print('SMS reçu du N° '..from..' : \"'..sms..'\"')"
   for name, number in pairs(user) do
      reponse = guess
      if number == from then
         print('SMS reçu de '..name..' : \"'..sms..'\"')
         reponse = notGood
         msg = "print('SMS, commande invalide')"
         for message, action in pairs(liste) do
            if sms == message then
               reponse = good
               msg = "print('SMS, commande correcte')"
               load(action)()
               break
            end
         end
         break
      end   
   end
   load(msg)()
   --print('SMS : réponse -> '..reponse)
   --print('SMS : réponse -> '..url_encode(reponse))
   commandArray['OpenURL']=gateway..'/send.html?smsto='..from..'&smsbody='..url_encode(reponse)..'&smstype=sms'
end

return commandArray

Il faut uniquement modifier à l’intérieur de ce script :

  • la liste des numéros autorisés au format +336XXXXXXX ‘le nom importe peu)
  • l’ip et le port du serveur SMS gateway pour que le script puisse vous répondre par sms.
  • la liste des messages à reconnaitre et les actions qui vont en découler.

 

Quelques explications générales.

le format des actions  est sous la forme liste = reponse= et/ou commandArray

Ex :  liste [‘le message sms que je dois envoyer’] = [[ reponse = des instructions Lua qui vont bien ]]

  • N.B Si il n’y a pas le bloc reponse, le SMS renvoyé en accusé de réception de commande sera OK (variable locale good).
  • N.B2 : Si vous supprimez reponse = ‘bla bla bla’ , faites attention de conserver les 2 crochets du bout ]], c’est du vécu.

 

Exemples :

  • Les températures
liste['Temp salon'] =       [[   reponse = 'Il fait '..string.sub(otherdevices_svalues['salon'],1,4)..'°C dans le salon'   ]]

Lorsque, par SMS, j’envoie Temp salon (attention à la casse des caractères), la réponse SMS qui est adressée est « il fait X °C dans le salon » et on va chercher la température dans le périphérique Domoticz nommé ‘salon’

  • Les interrupteurs
liste['Douche'] =          [[   commandArray['douche'] = 'On'
                        reponse = 'Je mets le salle de bain en chauffe'   ]]

En envoyant Douche par SMS on passe l’interrupteur nommé douche à On dans Domoticz et on renvoie un SMS qui dit ‘Je mets la salle de bain en chauffe’.

  • Gestion des groupes
liste['Tout éteindre'] =    [[   commandArray['Group:toute la maison'] = 'Off'   ]]

Le commandArray[‘Group:nom_du_groupe’] = ‘On’ ou ‘Off’ bascule tout le groupe dans l’état demandé. Les groupes sont ceux définis dans le menu « Scénarios ».

  • Le panneau de Sécurité
liste['Alarme on'] =       [[   commandArray['SecPanel'] = 'Arm Away'
                        reponse = 'Alarme activée dans 30s'   ]]
liste['Alarme off'] =       [[   commandArray['SecPanel'] = 'Disarm'
                        reponse = 'Alarme désactivée'   ]]

Alarme on, Alarme Off activent/désactivent le panneau de sécurité Domoticz.

  • Exécution d’un autre script
liste['Spoon'] =          [[   os.execute('/home/vil1driver/domoticz/scripts/lua/spoon.sh') ]]

Spoon envoyé par SMS, lance le script précisé dans le os.execute

  • Exécution de Lua
liste['Ya qqn'] =         [[   function timedifference(d)
                           s = otherdevices_lastupdate[d]
                           year = string.sub(s, 1, 4)
                           month = string.sub(s, 6, 7)
                           day = string.sub(s, 9, 10)
                           hour = string.sub(s, 12, 13)
                           minutes = string.sub(s, 15, 16)
                           seconds = string.sub(s, 18, 19)
                           t1 = os.time()
                           t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
                           difference = os.difftime (t1, t2)
                           return difference .....
.....

Remarquez que le ‘Ya qqn’ execute une portion de Lua puis remplit une variable Lua nommée reponse qui est le message SMS envoyé.

  • Connaitre l’état d’un interrupteur.

Récupérez l’état de la variable concernée par un otherdevices[‘votre_interrupteur’]

liste['Alarme'] =         [[   reponse = 'L\'alarme est sur '..otherdevices['Alarme'] ]]

L’état sera envoyé lors de l’envoi du SMS : Alarme

 

Voyez que c’est extrêmement puissant et très fonctionnel. Cela nécessite une petite connaissance de Lua et des fonctionnalités Domoticz.

En vrac

  • Vous pouvez envoyer un SMS contenant Help (H majuscule) , la liste des actions possibles vous est retournée immédiatement.
  • Dans le cas ou un SMS est envoyé à une personne absente de la liste , elle reçoit un SMS disant « Je ne vous connais pas »
  • Respectez bien la casse dans vos messages.
  • N’oubliez pas  de fermer vos  ]].
  • Attention : Si vous voulez envoyer par SMS une apostrophe, il faut dans reponse mettre un \ devant celle ci

liste['Alarme'] =         [[   reponse = 'L\'alarme est sur '..otherdevices['Alarme'] ]]

  • Le log de Domoticz affiche les messages reçus , pratique

Merci encore à Vil1driver pour ce magnifique travail.

gateau2

 

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/
Posted in domoticz, domotique, scripts.

7 Comments

  1. bonjour

    un an que l’article est publié mais j’ai toujours voulu le mettre en place

    c’est chose faite, et … ça marche 😀

    je vais l’utiliser dans un local distant, souvent innocupé mais dont je souhaite avoir des infos régulières

    je n’ai plus qu’a m’amuser avec des commandes personnalisées et constater l’étendue des possibilités

     

    un énorme merci pour le travail, je tacherai d’expliquer à d’autres (dans mon FabLab) comment mettre en place tout ça …

    Jean-Phi

  2. bonjour Patrice

    petit retour après quelques jours d’utilisation

    ça fonctionne souvent mais pas tout le temps, je pense que ma réception SMS est pas top, et mon internet (qui passe par la 3G) aussi… avec des décos de temps en temps (snif)

    j’ai pu rajouter des fonctions genre « photo rdc » et « photo etage » qui déclenche par SMS l’envoi par mail d’une photo prise avec une des caméras (des vieux smartphones avec l’appli IpCam), ça fonctionne bien (quand internet est ok )

    bizarrement le « Help » ne fonctionne pas, ne renvoie rien ?

    j’ai quelques soucis avec les accents aussi dans les sms reçu

    l’idéal pour moi serait d’envoyer les photos par MMS, penses tu qu’il y ait moyen ? j’ai plus confiance dans l’abo free à 2€ que ma connexion internet…

    merci!

    à bientôt

    Jean-Philippe

  3. Bonjour
    Je ne sais pas pour l’envoi de MMS, est ce que IPCam ne peut pas faire cela, ou alors un script TASKER qui surveille l’apparition d’une photo (je dis ça au pif, je ne sais pas si c »‘est possible)

  4. Bonjour,

    Tout d’abord, merci beaucoup !
    Ce super article va, je l’espère, me permettre de récupérer le sms envoyé par mon alarme pour récupérer le statut de mon alarme sur domoticz.

    J’ai une question,
    sous SMS Gateway Ultimate, lorsque je reçois un sms, le log me dit qu’il y a un problème de certificat (je me suis connecté via https depuis l’extérieur de mon réseau lan via No-IP) : « Trust anchor for certification path not found… ».
    Comment puis-je résoudre ce problème de certificat sur mon Rasperry ?

    Merci !

  5. Bonjour,

    J’ai mis en place toute la procedure pour piloter domoticz par l’intermediaire d’un vieux smartphone. Tout se passe bien.

    Remarque 1: pour des retours de temperature seulement 3 temperatures sont possible par SMS.  Faire aussi attention à la longueur de la ligne dans le fichier LUA

    Remarque 2 : Si il y a trop de commande « liste[xxx] la commande Help ne renvoit rien.

    Toutefois j’ai un probleme pour commander des volets roulants a travers les commandes SMS aussi bien par un groupe que individuellement.

    Que faut il mettre dans la ligne de commande apres le =

    J’ai essayé On Off Ouvert Fermé .  Rien ne commande le ou les volets.

    Votre aide sera la bienvenue

    Merci

  6. Pingback: Communiquer par SMS avec Domoticz via un modem USB 3G - Domo-Attitude.fr

Laisser un commentaire

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