Page 4 sur 8

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 06 juil. 2022, 14:53
par jackyhi
Si je modifie manuellement la variable sms dans Domoticz
1)idx 8 sms Chaîne Help;336xxxxxx57 2022-07-06 14:44:22
log domoticz :
2022-07-06 14:44:22.655 Status: LUA: SMS reçu de JHxxxx : "Help"
2022-07-06 14:44:22.656 Status: LUA: SMS, commande correcte
2022-07-06 14:44:22.656 Status: LUA: SMS : reponse -> Je comprend: Ping
Image





2)iidx 8 sms Chaîne Bonjour;336xxxxxx57 2022-07-06 14:47:55
log domoticz :
2022-07-06 14:47:55.482 Status: LUA: SMS reçu de JHxxxx : "Bonjour"
2022-07-06 14:47:55.482 Status: LUA: SMS, commande invalide
2022-07-06 14:47:55.482 Status: LUA: SMS : reponse -> Je ne comprends pas, essayez 'Help'
Image

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 06 juil. 2022, 20:58
par Keros
Je viens de faire un essai avec une commande API "fausse" et DomoticZ n'affiche pas d'erreur. La seule info serait le retour dans la console. Mais comment avec ces logs ... Je ne me souviens plus comment je l'avais débogué pour le rendre fonctionnel :?

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 06 juil. 2022, 21:21
par jackyhi
Depuis cet après midi raspisms ne reçoit plus les sms que j'envoie avec mon portable.

Je pense que je vais désinstaller raspisms et gammu et ensuite réinstaller ces 2 applications !

Est-ce que ça va marcher?

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 07 juil. 2022, 00:03
par jackyhi
je viens de désinstaller raspiSMS gammu-smsd gammu.
Et j'ai réinstaller uniquement gammu et raspiSMS.

les sms arrivent bien et les envois fonctionnent :) :) :)

Du coup j'ai reçu en rafale les sms qui étaient bloqués!!!
Image

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 07 juil. 2022, 00:11
par jackyhi
Reste maintenant à modifier le fichier fichier gammu_get_unread_sms.py

avec la modif proposée par Keros:

ajout de :import requests

et

Code : Tout sélectionner

           #Mise a jour dans Domoticz
                r = requests.get("http://192.168.0.21:9186/json.htm?type=command&param=updateuservariable&idx=8&vname=sms&vtype=2&vvalue="+m['Text']+";%2B"+m['Number'][1:])


Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 07 juil. 2022, 10:56
par jackyhi
:P ça fonctionne parfaitement !!!
Merci encore à Keros pour son Tuto.

Image

voici mon fichier gammu_get_unread_sms.py
que j'ai edité de la façon suivante:

Code : Tout sélectionner

pi@DomPi2:~ $ sudo -i
root@DomPi2:~# nano /usr/share/raspisms/bin/gammu_get_unread_sms.py

root@DomPi2:~# exit
De cette façon je n'ai pas besoin de modifier les droits sur le fichier: gammu_get_unread_sms.py

Code : Tout sélectionner

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# vim: expandtab sw=4 ts=4 sts=4:
#

from __future__ import print_function
import gammu
import sys
import json
import requests

def main():
    state_machine = gammu.StateMachine()

    if len(sys.argv) < 2:
        sys.exit(1)
    else :
        state_machine.ReadConfig(Filename=sys.argv[1])
        del sys.argv[1]

    state_machine.Init()

    status = state_machine.GetSMSStatus()

    remain = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed']

    start = True

    try:
        while remain > 0:
            if start:
                sms = state_machine.GetNextSMS(Start=True, Folder=0)
                start = False
            else:
                sms = state_machine.GetNextSMS(
                  Location=sms[0]['Location'], Folder=0
                )
            remain = remain - len(sms)

            for m in sms :
                if m['State'] != 'UnRead' :
                    continue
                #Mise a jour dans Domoticz
                r = requests.get("http://192.168.0.21:9186/json.htm?type=command&param=updateuservariable&idx=8&vname=sms&vtype=2&vvalue="+m['Text']+";%2B"+m['Number'][1:])

                print(json.dumps({
                    'number': m['Number'],
                    'at': str(m['DateTime']),
                    'status': m['State'],
                    'text': m['Text'],
                }))

    except gammu.ERR_EMPTY:
        #do noting
        return True


if __name__ == '__main__':
    main()


et mon fichier script Lua script_variable_sms.lua

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 liste={}
--liste['message'] = "action"
liste['Help'] =          [[   reponse = 'liste des commandes : \n'..sendAll()   ]]   -- ne pas toucher cette ligne

--liste['Ping'] =        [[   reponse = 'Pong!'   ]]

liste['Armaway'] =       [[   reponse = 'Alarme en Absence activée dans 40s !'   ]]                      

liste['Alarme off'] =    [[   reponse = 'Alarme désactivée !'   ]]

liste['Armhome'] =       [[   reponse = 'Alarme home activée dans 10s'   ]]

liste['Sirstop'] =       [[   reponse = 'Sirènes et Flash Stoppés'   ]] 

liste['Sendsms off'] =   [[   reponse = 'Envoi de sms type1 désactivé !'   ]]

liste['Sendsms on'] =    [[   reponse = 'Envoi de sms type1 activé !'   ]]                        

liste['Initsiren'] =     [[   reponse = 'Hard Reset des sirènes' ]]

-- liste des utilisateurs autorisés
local user={}
user['Nom1'] = '+336XXXXXXXX'
user['Nom2'] = '+336XXXXXXXX'
user['Nom3'] = '+336XXXXXXXX'

-- 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

function sendsms(smsto, smsbody)
	        
	        smsbody = urlencode(smsbody)

          os.execute("curl -X POST http://192.168.0.21/raspisms/api/scheduled/ -H 'X-Api-Key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx -d text="..smsbody.." -d numbers=%2B"..smsto)

        end
        
        function char_to_hex(c)
          return string.format("%%%02X", string.byte(c))
        end
        
         function urlencode(url)
          if url == nil then
            return
          end
          url = url:gsub("([^%w ])", char_to_hex)
          url = url:gsub(" ","%%20")
          return url
        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 : reponse -> '..reponse)
    --os.execute ('sudo -u gammu gammu-smsd-inject TEXT "'..from..'" -text "'..reponse..'"')
	sendsms(from, reponse)
end

return commandArray

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 07 juil. 2022, 11:40
par jackyhi
par Keros
Forcer un reboot de DomoticZ via SMS

Tout ça, c'est bien, mais ça repose sur le principe que DomoticZ est fonctionnel. En effet, si on lui envoi une demande pour redémarrer alors qu'il est planté, il ne se passera rien.

L'idée est de traiter cette commande directement au niveau du script Python vu au paragraphe précédent. Le script Python voit le SMS avant quelle ne soit transférée à DomoticZ donc, même si DomoticZ est planté, il pourra lancer la commande.

Mon fichier .py avec la gestion du reboot :

Code : Tout sélectionner


    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    # vim: expandtab sw=4 ts=4 sts=4:
    #

    from __future__ import print_function
    import gammu
    import sys
    import json
    import requests
    import subprocess

    def main():
        state_machine = gammu.StateMachine()
        
        if len(sys.argv) < 2:
            sys.exit(1)
        else :
            state_machine.ReadConfig(Filename=sys.argv[1])
            del sys.argv[1]

        state_machine.Init()

        status = state_machine.GetSMSStatus()

        remain = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed']

        start = True

        try:
            while remain > 0:
                if start:
                    sms = state_machine.GetNextSMS(Start=True, Folder=0)
                    start = False
                else:
                    sms = state_machine.GetNextSMS(
                        Location=sms[0]['Location'], Folder=0
                    )
                remain = remain - len(sms)

                for m in sms :
                    if m['State'] != 'UnRead' :
                        continue
                    #Mise a jour dans Domoticz
                    r = requests.get("http://127.0.0.1:8080/json.htm?type=command&param=updateuservariable&idx=1&vname=sms&vtype=2&vvalue="+m['Text']+";%2B"+m['Number'][1:])
                    
                    #Action directe
                    if m['Number'][1:] == '33xxxxxxxx' and m['Text'] == 'Reboot DZ':
                        subprocess.run(["/home/pi/domoticz/scripts/restart_domoticz"], shell=True)
                    else :
                        print(json.dumps({
                            'number': m['Number'],
                            'at': str(m['DateTime']),
                            'status': m['State'],
                            'text': m['Text'],
                            })
                        )
                    

        except gammu.ERR_EMPTY:
            #do noting
            return True


    if __name__ == '__main__':
        main()
Vous pouvez même prévoir un sudo reboot ;)
Losque je modifie le fichier avec la commande restart_domoticz raspiSMS est bloqué , il ne reçoit plus ni n'envoie les sms!! :o

Y-at-il un problème de syntaxe?? qui peut m'aider??

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 07 juil. 2022, 12:36
par Keros
Tu as bien rajouter le import subprocess au début ?

Essaye de nous mettre les scripts sur lesquels tu as des erreurs : ça nous permet d'analyser.

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 07 juil. 2022, 14:35
par jackyhi
J'ai joint dans ma publication précédente la copie du script gammu_get_unread_sms.py qui je suppose ne fonctionne pas !
Parce que je n'ai aucun message d'erreur dans le journal de log de domoticz.
Seulement raspiSMS ne reçoit plus les sms que j'envoie "Reboot DZ" et je n'arrive plus envoyer de sms à partir de raspiSMS quand j'applique la modification. au fichier gammu_get_unread_sms.py! :oops: :oops:

Re: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Publié : 07 juil. 2022, 14:43
par jackyhi
le script qui fonctionne gammu_get_unread_sms.py:

Code : Tout sélectionner

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# vim: expandtab sw=4 ts=4 sts=4:
#

from __future__ import print_function
import gammu
import sys
import json
import requests

def main():
    state_machine = gammu.StateMachine()

    if len(sys.argv) < 2:
        sys.exit(1)
    else :
        state_machine.ReadConfig(Filename=sys.argv[1])
        del sys.argv[1]

    state_machine.Init()

    status = state_machine.GetSMSStatus()

    remain = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed']

    start = True

    try:
        while remain > 0:
            if start:
                sms = state_machine.GetNextSMS(Start=True, Folder=0)
                start = False
            else:
                sms = state_machine.GetNextSMS(
                  Location=sms[0]['Location'], Folder=0
                )
            remain = remain - len(sms)

            for m in sms :
                if m['State'] != 'UnRead' :
                    continue
                #Mise a jour dans Domoticz
                r = requests.get("http://192.168.0.21:9186/json.htm?type=command&param=updateuservariable&idx=8&vname=sms&vtype=2&vvalue="+m['Text']+";%2B"+m['Number'][1:])

                print(json.dumps({
                    'number': m['Number'],
                    'at': str(m['DateTime']),
                    'status': m['State'],
                    'text': m['Text'],
                }))

    except gammu.ERR_EMPTY:
        #do noting
        return True


if __name__ == '__main__':
    main()


le script qui bloque raspiSMS gammu_get_unread_sms.py:

Code : Tout sélectionner

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    # vim: expandtab sw=4 ts=4 sts=4:
    #

    from __future__ import print_function
    import gammu
    import sys
    import json
    import requests
    import subprocess

    def main():
        state_machine = gammu.StateMachine()
        
        if len(sys.argv) < 2:
            sys.exit(1)
        else :
            state_machine.ReadConfig(Filename=sys.argv[1])
            del sys.argv[1]

        state_machine.Init()

        status = state_machine.GetSMSStatus()

        remain = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed']

        start = True

        try:
            while remain > 0:
                if start:
                    sms = state_machine.GetNextSMS(Start=True, Folder=0)
                    start = False
                else:
                    sms = state_machine.GetNextSMS(
                        Location=sms[0]['Location'], Folder=0
                    )
                remain = remain - len(sms)

                for m in sms :
                    if m['State'] != 'UnRead' :
                        continue
                    #Mise a jour dans Domoticz
                r = requests.get("http://192.168.0.21:9186/json.htm?type=command&param=updateuservariable&idx=8&vname=sms&vtype=2&vvalue="+m['Text']+";%2B"+m['Number'][1:])
                    
                    #Action directe
                    if m['Number'][1:] == '336xxxxxx' and m['Text'] == 'Reboot DZ':
                        subprocess.run(["/home/pi/domoticz/scripts/restart_domoticz"], shell=True)
                    else :
                        print(json.dumps({
                            'number': m['Number'],
                            'at': str(m['DateTime']),
                            'status': m['State'],
                            'text': m['Text'],
                            })
                        )
                    

        except gammu.ERR_EMPTY:
            #do noting
            return True


    if __name__ == '__main__':
        main()
        
        
Des suggestions ??