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

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

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¶m=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

ça fonctionne parfaitement !!!
Merci encore à Keros pour son Tuto.
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¶m=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¶m=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¶m=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!!
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!

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¶m=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¶m=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 ??