[LUA] Contrôler domoticz par SMS

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
jackyhi
Messages : 97
Inscription : 09 mai 2016, 23:49

Re: contrôler domoticz par SMS

Message par jackyhi »

Bonjour,
un grand MERCI ! à Vil1driver pour cette application de contrôle de domoticz par sms que j'utilise avec succès depuis 1 an :D

J'ai maintenant un problème d'affichage de la réponse à la commande 'Help', les sms étant limités à 165 caractères et ma liste de commandes s'allongeant, je n'ai plus de retour de la commande Help. :(

J'ai un peu de mal à comprendre le fonctionnement du scrit_variable_sms.lua, il y a une function définie sendAll() qui n'est pas utilisée dans le script lui même!! à quoi sert-elle?

Mon projet serait de pouvoir scinder en 2 (voir 3) messages sms successif en réponse à la commande Help pour contourner la limite de 165 caractères, est ce possible? :?:
Raspberry Pi2 VPN, Pi 3, Pi4 ,RFXCom, 6 volets BLYSS, sondes Temp_humid Attiny85, zigbee, Mysensors, RFLINK , Zwave capteurs portes Prises, Alarme avec 2 sirènes maison esp8266, Thermostat NETAMO vannes thermostatiques
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: contrôler domoticz par SMS

Message par Keros »

J'ai vite rencontré le même problème : je me suis fait un fichier texte dans le téléphone avec les commandes.

Ce serait possible de faire un transfert sur plusieurs sms, mais ça risque de couper les mots / commandes en plein milieu : c'est un peu plus de boulot pour gérer tous ces cas :?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
jackyhi
Messages : 97
Inscription : 09 mai 2016, 23:49

Re: contrôler domoticz par SMS

Message par jackyhi »

Merci pour la réponse.

J'ai essayé cette solution qui semble fonctionner mais je ne suis pas un spécialiste de la programmation!!

Code : Tout sélectionner

-- 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 liste1={}
--liste1['message'] = "action"
liste1['Help1'] =             [[   reponse = sendAll1()   ]]   -- ne pas toucher cette ligne  
liste1['Amhome on'] =       [[   commandArray['MA_alarme'] = 'Arm Home'
                        reponse = 'Alarme activée dans 10s'   ]]
liste1['Alarme on'] =       [[   commandArray['MA_alarme'] = 'Arm Away'
                        reponse = 'Alarme activée dans 10s'   ]]                      
liste1['Alarme off'] =       [[   commandArray['MA_alarme'] = 'Disarm'
                        reponse = 'Alarme désactivée'   ]]

local liste2={}
--liste2['message'] = "action"
liste2['Help2'] =             [[   reponse = sendAll2()   ]]   -- ne pas toucher cette ligne
liste2['Tsalon'] =        [[   reponse = 'Temp Salon: '..string.sub(otherdevices_svalues['CrestaRfxSalon'],1,4)..'°C'..'\n'..
                                'Hum Salon: '..string.sub(otherdevices_svalues['CrestaRfxSalon'],6,8)..'%'   ]]
liste2['Tsdb'] =          [[   reponse = 'Temp SDBain: '..string.sub(otherdevices_svalues['CrestaRfxSDB'],1,4)..'°C'..'\n'..
                                'Hum SDBain: '..string.sub(otherdevices_svalues['CrestaRfxSDB'],6,8)..'%'     ]]
liste2['Tetage'] =          [[   reponse = 'Temp Ch Etage: '..string.sub(otherdevices_svalues['CrestaRfxEtage'],1,4)..'°C'..'\n'..
                                'Hum Ch Etage: '..string.sub(otherdevices_svalues['CrestaRfxEtage'],6,8)..'%'     ]]
liste2['Tchderr'] =          [[   reponse = 'Temp Ch Derr: '..string.sub(otherdevices_svalues['OregonChDerr'],1,4)..'°C'..'\n'..
                                'Hum ChDerr: '..string.sub(otherdevices_svalues['OregonChDerr'],6,8)..'%'     ]]
liste2['Tbas'] =          [[   reponse = 'Temp Salon: '..string.sub(otherdevices_svalues['CrestaRfxSalon'],1,4)..'°C'..'\n'..
                              'Temp SDBain: '..string.sub(otherdevices_svalues['CrestaRfxSDB'],1,4)..'°C']]
liste2['Tch'] =           [[   reponse =   'Temp Ch Etage: '..string.sub(otherdevices_svalues['CrestaRfxEtage'],1,4)..'°C'..'\n'..
                              'Temp Ch Derr: '..string.sub(otherdevices_svalues['OregonChDerr'],1,4)..'°C']]                               

local liste3={}
--liste['message'] = "action"
liste3['Help3'] =             [[   reponse = sendAll3()   ]]   -- ne pas toucher cette ligne                       
liste3['Pzbur on'] =          [[   commandArray['PriseZwave_Bureau'] = 'On'
                         reponse = 'PriseZwave_Bureau Allumée'    ]]
liste3['Pzbur off'] =          [[   commandArray['PriseZwave_Bureau'] = 'Off'
                        reponse = 'PriseZwave_Bureau Eteinte'   ]]
liste3['Pzbur7 on'] =          [[   commandArray['PriseZwave_7Bureau'] = 'On'
                         reponse = 'PriseZwave_7Bureau Allumée'    ]]
liste3['Pzbur7 off'] =          [[   commandArray['PriseZwave_7Bureau'] = 'Off'
                        reponse = 'PriseZwave_7Bureau Eteinte'   ]]                      

-- liste des utilisateurs autorisés
local user={}
user['Nom1xxx'] = '+336XXXXXX'
user['Nom2xxx'] = '+336XXXXXX'
user['Nom3xxx'] = '+337XXXXXX'
-- etc..      

-- paramètres du serveur SMS Gateway Ultimate   
local gateway = 'http://xxx.xxx.xxx.xx:XXXX'      -- 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 \'Help1 ou Help2 ou Help3\''      -- 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 sendAll1()
   for message, action in spairs(liste1) do
      if message ~= 'Help1'  then
         if rst == nil then
            rst = message
         else
            rst = rst..'\n'..message --'; '..message
         end
      end      
   end
   return rst
end   
function sendAll2()
   for message, action in spairs(liste2) do
      if message ~= 'Help2' then
         if rst == nil then
            rst = message
         else
            rst = rst..'\n'..message --'; '..message
         end
      end      
   end
   return rst
end
function sendAll3()   
   for message, action in spairs(liste3) do
      if message ~= 'Help3' then
         if rst == nil then
            rst = message
         else
            rst = rst..'\n'..message --'; '..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(liste1) do
            if sms == message then
               reponse = good
               msg = "print('SMS, commande correcte')"
               load(action)()
               break
            end
         end
        for message, action in pairs(liste2) do
            if sms == message then
               reponse = good
               msg = "print('SMS, commande correcte')"
               load(action)()
               break
            end
        end 
        for message, action in pairs(liste3) 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
Raspberry Pi2 VPN, Pi 3, Pi4 ,RFXCom, 6 volets BLYSS, sondes Temp_humid Attiny85, zigbee, Mysensors, RFLINK , Zwave capteurs portes Prises, Alarme avec 2 sirènes maison esp8266, Thermostat NETAMO vannes thermostatiques
jackyhi
Messages : 97
Inscription : 09 mai 2016, 23:49

Re: contrôler domoticz par SMS

Message par jackyhi »

Pour être plus facile à utiliser quand on a la mémoire qui flanche,

j'ai fait 3 listes de commandes :
liste1 concernant les actions sur l'alarme
liste2 concernant les actions sur les sondes
liste3 concernant les actions sur les switchs

avec les commandes Helpalarme Helpsonde helpswitch correspondantes:
nouveau script mis à jour:

Code : Tout sélectionner

-- 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 liste1={} -- actions sur l'alarme
--liste1['message'] = "action"
liste1['Helpalarme'] =             [[   reponse = sendAll1()   ]]   -- ne pas toucher cette ligne  
liste1['Amhome on'] =       [[   commandArray['MA_alarme'] = 'Arm Home'
                        reponse = 'Alarme activée dans 10s'   ]]
liste1['Alarme on'] =       [[   commandArray['MA_alarme'] = 'Arm Away'
                        reponse = 'Alarme activée dans 10s'   ]]                      
liste1['Alarme off'] =       [[   commandArray['MA_alarme'] = 'Disarm'
                        reponse = 'Alarme désactivée'   ]]

local liste2={}-- actions sur les sondes
--liste2['message'] = "action"
liste2['Helpsonde'] =             [[   reponse = sendAll2()   ]]   -- ne pas toucher cette ligne
liste2['Tsalon'] =        [[   reponse = 'Temp Salon: '..string.sub(otherdevices_svalues['CrestaRfxSalon'],1,4)..'°C'..'\n'..
                                'Hum Salon: '..string.sub(otherdevices_svalues['CrestaRfxSalon'],6,8)..'%'   ]]
liste2['Tsdb'] =          [[   reponse = 'Temp SDBain: '..string.sub(otherdevices_svalues['CrestaRfxSDB'],1,4)..'°C'..'\n'..
                                'Hum SDBain: '..string.sub(otherdevices_svalues['CrestaRfxSDB'],6,8)..'%'     ]]
liste2['Tetage'] =          [[   reponse = 'Temp Ch Etage: '..string.sub(otherdevices_svalues['CrestaRfxEtage'],1,4)..'°C'..'\n'..
                                'Hum Ch Etage: '..string.sub(otherdevices_svalues['CrestaRfxEtage'],6,8)..'%'     ]]
liste2['Tchderr'] =          [[   reponse = 'Temp Ch Derr: '..string.sub(otherdevices_svalues['OregonChDerr'],1,4)..'°C'..'\n'..
                                'Hum ChDerr: '..string.sub(otherdevices_svalues['OregonChDerr'],6,8)..'%'     ]]
liste2['Tbas'] =          [[   reponse = 'Temp Salon: '..string.sub(otherdevices_svalues['CrestaRfxSalon'],1,4)..'°C'..'\n'..
                              'Temp SDBain: '..string.sub(otherdevices_svalues['CrestaRfxSDB'],1,4)..'°C']]
liste2['Tch'] =           [[   reponse =   'Temp Ch Etage: '..string.sub(otherdevices_svalues['CrestaRfxEtage'],1,4)..'°C'..'\n'..
                              'Temp Ch Derr: '..string.sub(otherdevices_svalues['OregonChDerr'],1,4)..'°C']]                               

local liste3={} -- actions sur les switchs
--liste['message'] = "action"
liste3['Helpswitch'] =             [[   reponse = sendAll3()   ]]   -- ne pas toucher cette ligne                       
liste3['Pzbur on'] =          [[   commandArray['PriseZwave_Bureau'] = 'On'
                         reponse = 'PriseZwave_Bureau Allumée'    ]]
liste3['Pzbur off'] =          [[   commandArray['PriseZwave_Bureau'] = 'Off'
                        reponse = 'PriseZwave_Bureau Eteinte'   ]]
liste3['Pzbur7 on'] =          [[   commandArray['PriseZwave_7Bureau'] = 'On'
                         reponse = 'PriseZwave_7Bureau Allumée'    ]]
liste3['Pzbur7 off'] =          [[   commandArray['PriseZwave_7Bureau'] = 'Off'
                        reponse = 'PriseZwave_7Bureau Eteinte'   ]]                      

-- liste des utilisateurs autorisés
local user={}
user['Nom1xxx'] = '+336XXXXXX'
user['Nom2xxx'] = '+336XXXXXX'
user['Nom3xxx'] = '+337XXXXXX'
-- etc..      

-- paramètres du serveur SMS Gateway Ultimate   
local gateway = 'http://xxx.xxx.xxx.xx:XXXX'      -- 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 \'Helpalarme ou Helpsonde ou Helpswitch\''      -- 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 sendAll1()
   for message, action in spairs(liste1) do
      if message ~= 'Helpalarme'  then
         if rst == nil then
            rst = message
         else
            rst = rst..'\n'..message --'; '..message
         end
      end      
   end
   return rst
end   
function sendAll2()
   for message, action in spairs(liste2) do
      if message ~= 'Helpsonde' then
         if rst == nil then
            rst = message
         else
            rst = rst..'\n'..message --'; '..message
         end
      end      
   end
   return rst
end
function sendAll3()   
   for message, action in spairs(liste3) do
      if message ~= 'Helpswitch' then
         if rst == nil then
            rst = message
         else
            rst = rst..'\n'..message --'; '..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(liste1) do
            if sms == message then
               reponse = good
               msg = "print('SMS, commande correcte')"
               load(action)()
               break
            end
         end
        for message, action in pairs(liste2) do
            if sms == message then
               reponse = good
               msg = "print('SMS, commande correcte')"
               load(action)()
               break
            end
        end 
        for message, action in pairs(liste3) 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
Raspberry Pi2 VPN, Pi 3, Pi4 ,RFXCom, 6 volets BLYSS, sondes Temp_humid Attiny85, zigbee, Mysensors, RFLINK , Zwave capteurs portes Prises, Alarme avec 2 sirènes maison esp8266, Thermostat NETAMO vannes thermostatiques
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: contrôler domoticz par SMS

Message par Keros »

Je n'avais pas pensé faire des groupes d'éléments. Bien vu !
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
DiliaK
Messages : 257
Inscription : 02 sept. 2022, 19:38
Localisation : Chavanoz, France
Contact :

Re: [LUA] Contrôler domoticz par SMS

Message par DiliaK »

Je note ce système, ça m'a donné des idées.
Utilisant un serveur sms @ home (gammu smsd et playsms), ça devrait être très utile en cas de perte de la box.
Merci pour le tuto !
Domoticz 2025.2 @ Debian 12 on AZW Green G2. Processeur : Intel Celeron N5095A Mémoire : 8 Go
HDD WD Red 500Go M.2 SATA
RFXCOM - RFXtrx433 USB 433.92MHz Transceiver Version: Pro XL1
RFXCOM - RFXtrx433 ethernet (inactif)
CONBEE II USB Zigbee4Domoticz
Répondre