Page 12 sur 12

Re: contrôler domoticz par SMS

Publié : 11 janv. 2021, 09:53
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? :?:

Re: contrôler domoticz par SMS

Publié : 11 janv. 2021, 12:31
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 :?

Re: contrôler domoticz par SMS

Publié : 11 janv. 2021, 14:19
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

Re: contrôler domoticz par SMS

Publié : 11 janv. 2021, 15:34
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

Re: contrôler domoticz par SMS

Publié : 11 janv. 2021, 18:25
par Keros
Je n'avais pas pensé faire des groupes d'éléments. Bien vu !

Re: [LUA] Contrôler domoticz par SMS

Publié : 06 janv. 2024, 18:48
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 !