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 ?.
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.
Validez puis notez le numéro Idx associé à cette variable.
Installation et configuration, de l’appli 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¶m=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’
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.
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)
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¶m=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.
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
Merci pour ton merci 🙂
et bon courage pour la formation domotique
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
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)
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 !
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
Pingback: Communiquer par SMS avec Domoticz via un modem USB 3G - Domo-Attitude.fr