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

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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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
Pièces jointes
RaspiSMScopy_ecran3.jpg
RaspiSMScopy_ecran3.jpg (14.15 Kio) Consulté 2090 fois
RaspiSMScopy_ecran2.jpg
RaspiSMScopy_ecran2.jpg (10.69 Kio) Consulté 2090 fois
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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 :?
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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?
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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
Pièces jointes
RaspiSMScopy_ecran4.jpg
RaspiSMScopy_ecran4.jpg (66.55 Kio) Consulté 2034 fois
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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:])

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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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
Pièces jointes
RaspiSMScopy_ecran5.jpg
RaspiSMScopy_ecran5.jpg (15.96 Kio) Consulté 2000 fois
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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??
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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.
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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:
Dernière modification par Keros le 07 juil. 2022, 18:43, modifié 1 fois.
Raison : Citation supprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
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: [Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message 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 ??
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
Répondre