Domoticz – Pilotez votre serveur par SMS

Oui, il est possible de piloter son serveur Domoticz par SMS : Plus besoin d’une connexion Internet pour envoyer des commandes ou pour avoir une remontée d’information de votre installation Domotique. Dans mon cas, cela me permet de relancer un router 4G avec une prise connectée, d’allumer plus rapidement une lumière, car pas besoin de lancer l’appli sur le smartphone, mais aussi de désactiver / activer une alarme (là aussi plus rapidement), pas d’application à lancer et pas de code à saisir. Pour mettre tout ça en marche, nous allons utiliser le script d’un fidèle membre du forum easy domoticz.

De quoi avons-nous besoin ?

Pour mettre cela en place, nous avons besoin de :

  • Un smartphone avec une carte SIM (Free à 0€ par exemple) ;
  • Application SMS Gateway Ultimate ;
  • Un script.

Paramétrage de Domoticz

Dans Domoticz allez sur Réglages, puis Plus d’options et Variables utilisateur.
On ajoute une variable avec le nom sms, puis dans type de variable sélectionnez Chaîne et Ajouter.
Une fois ajouté, repérez le numéro de l’IDX ici 1… il nous sera utile pour la suite.

Si vous avez un mot de passe pour accéder à votre Domoticz, il va falloir autoriser l’IP local de votre smartphone à se connecter sans identification. Normalement, c’est possible en ajoutant le login / mot de passe dans le lien que l’on va devoir ajouter, mais ça ne fonctionne pas. Pour cela, allez dans Réglages puis Paramètres et dans la colonne de gauche allez au niveau de Réseaux locaux et indiquez l’IP fixe de votre smartphone.

Paramétrage du smartphone

Sur le smartphone connecté à votre réseau, installez l’application SMS Gateway Ultimate. Depuis peu de temps, elle n’est plus disponible sur le Play Store officiel. Il vous faudra la trouver sur une autre source. Une fois l’application installée, paramétrez votre serveur SMS. Pour cela, je vous renvoie vers la fin de cet article. Une fois l’opération réalisée, stopper le serveur SMS et sélectionnez Edit. Allez maintenant sur Rules puis Add. Tout en bas de la page au niveau de Forward to URL indiquez le lien suivant:

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

Remplacez les valeurs en gras : indiquez l’IP de votre serveur Domoticz, son port et remplacez IDX par le numéro vu plus haut pour mon exemple le 1. Une fois tout cela réalisé, faites retour et validez les changements par Yes et relancez le serveur SMS.

Avant d’aller plus loin, on va tester afin de voir si Domoticz reçoit bien le SMS. C’est facile… Envoyez un sms à votre smartphone avec un simple mot. Retournez ensuite sur Réglages puis Plus d’options et Variables utilisateur. Si tout est bien fait, vous devriez voir le mot et votre numéro de téléphone.

Ajout du script

Pour piloter Domoticz par SMS, il nous faut un script pour associer des mots clés à des actions, mais aussi autoriser que certains numéros de téléphone. À l’aide de Notepad++, copiez / collez le code si dessous.

-- 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 nas'] = 		[[	reponse = 	'Température Nas : '..string.sub(otherdevices_svalues['Synology Temp'],1,4)..'°C']]
liste['Temp'] = 			[[	reponse = 	'Température baie info : '..string.sub(otherdevices_svalues['Temperature baie info'],1,4)..'°C'..'\n'..
											'Serveur Debian : '..string.sub(otherdevices_svalues['Serveur Debian - CPU'],1,4)..'°C']]
liste['Router on'] = 		[[	commandArray['Router 4G'] = 'On'
								reponse = 'Router 4G allumé'	]]
liste['Router off'] = 		[[	commandArray['Router 4G'] = 'Off'
								reponse = 'Router 4G étein'	]]									
liste['Alarme on'] = 		[[	commandArray['Pave alarme'] = 'Arm Away'
								reponse = 'Alarme activée dans 10s'	]]
liste['Alarme off'] = 		[[	commandArray['Pave alarme'] = 'Disarm'
								reponse = 'Alarme désactivée'	]]	
liste['Lumiere'] = 			[[	commandArray['Eclairage 1'] = 'On'
								commandArray['Eclairage 2'] = 'On'
								reponse = 'Eclairage allumé'	]]
liste['Lumiere off'] = 			[[	commandArray['Eclairage 1'] = 'Off'
								commandArray['Eclairage TT 2'] = 'Off'
								reponse = 'Eclairage coupé'	]]
liste['Eclairage1'] = 				[[	commandArray['Eclairage 1'] = 'On'
								reponse = 'Eclairage 1 allumé'	]]	
liste['Eclairage1 off'] = 			[[	commandArray['Eclairage 1'] = 'Off'
								reponse = 'Eclairage 1 coupé'	]]
liste['Eclairage2'] = 			[[	commandArray['Eclairage 2'] = 'On'
								reponse = 'Eclairage 2 allumé'	]]	
liste['Eclairage2 off'] = 		[[	commandArray['Eclairage 2'] = 'Off'
								reponse = 'Eclairage 2 coupé'	]]						

-- liste des utilisateurs autorisés
local user={}
user['toto'] = '+33600000000'
user['toto2'] = '+33600000001'

-- etc..		

-- paramètres du serveur SMS Gateway Ultimate	
local gateway = '192.168.1.12:53478'	-- 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 

Dans le code ci-dessus, il va falloir modifier plusieurs choses. La première, c’est d’indiquer l’adresse de votre serveur. A la ligne 62 indiquez l’IP et le port… puis à la ligne 57, vous pouvez ajouter les numéros autorisés, pour en avoir plusieurs il suffit de faire un copier / coller d’une ligne.

Modification de la liste des commandes

Tout se passe à partir de la ligne 27. Explication, pour une sonde de température :

liste[‘Temp nas’] = [[ reponse = ‘Température Nas : ‘..string.sub(otherdevices_svalues[‘Synology Temp’],1,4)..’°C’]]

Ce qui est entre crochets après liste c’est le SMS qu’il faudra envoyer pour recevoir les infos. Ici quand j’envoie Temp nas, je recevrais la température par SMS. Libre à vous de mettre le mot que vous souhaitez. Je vous conseille de mettre une majuscule, car les smartphones mettent automatiquement une majuscule au début de la saisie des sms.
Ensuite, vous avez reponse entre guillemets. C’est le texte de réponse que vous recevrez par SMS. Indiquez ce que vous souhaitez. Pour finir, on va lui dire où aller chercher l’info c’est juste après svalues entre crochets et guillemets. Il faut ici indiquer le nom de votre dispositif… mais attention, il ne faut pas de caractères spéciaux.
Pour un éclairage et ou une prise connectée, c’est tout aussi simple

liste[‘Eclairage1 off’] = [[ commandArray[‘Eclairage 1’] = ‘Off’
reponse = ‘Eclairage 1 coupé’ ]]

On indique le SMS dans liste, à la suite de commandArray et on indique le nom du dispositif (Ici Elairage 1) puis on termine par reponse avec le SMS que l’on reçoit.

Si vous avez une alarme, il faut simplement renseigner à la suite de commandArray le nom du dispositif de sécurité intégré à Domoticz toujours sans caractères spéciaux.

liste[‘Alarme on’] = [[ commandArray[‘Pave alarme’] = ‘Arm Away’
reponse = ‘Alarme activée dans 10s’ ]]
liste[‘Alarme off’] = [[ commandArray[‘Pave alarme’] = ‘Disarm’
reponse = ‘Alarme désactivée’ ]]

Une fois que votre script est prêt, enregistrez le sous le nom de script_variable_sms.lua

Installation du script sur Domoticz

On va maintenant mettre ce script dans le dossier de Domoticz. Personnellement, je me sers de WinSCP pour dans un premier temps envoyez le fichier dans le dossier utilisateur. Mon fichier se trouve donc dans /home/sebr/script.

Ensuite à l’aide de Putty, je vais transférer le fichier dans le dossier de Domoticz, il doit être dans /home/votreuser/domoticz/script/lua.
Dans putty, il faut exécuter la commande avec des droits supérieurs et donc utiliser sudo.
Pour copier un fichier la commande est cp, voici la commande complète, remplacez votreuser par le votre et retirez script si vous l’avez mis directement dans votre dossier d’utilisateur.

sudo cp /home/votreuser/script/script_variable_sms.lua /home/votreuser/domoticz/script/lua

Validez par entrée et indiquez votre mot de passe.

Houston, est-ce que vous me recevez ?

Maintenant on teste, vous pouvez envoyer Help et le script doit vous retourner la liste de toutes vos commandes. Voici quelques captures…

Conclusion

Voilà une fonction très sympa et utile, cela rend le pilotage de son installation bien plus rapide et permet d’avoir toujours le contrôle sur ses volets, ses lumières même en cas de coupure de connexion internet filaire (ADSL, fibre …) ou même une résidence secondaire qui n’a pas d’accès à internet. Merci à vil1driver pour son script.