Page 1 sur 2

variable utilisateur trop lente

Publié : 29 nov. 2016, 14:44
par gawel3164
Salut,
j'ai fait un script dans lequel un message vocal est délivré à la détection d'un PIR. Pour n'avoir le message vocal qu'un fois dans la journée, je déclenche l'action à condition que le pir détecte et que la variable reset_vocal soit à 0. Une fois l'action déclenchée, je repasse la variable à 1. La variable ensuite est remise a zéro à minuit. ça fonctionne presque mais j'ai remarqué que la variable mettait du temps a passer à 1 et le pir me détectant plusieurs fois dans ce laps de temps, le message vocal est envoyé plusieurs fois. Avez vous une astuce pour contourner le problème??
merci

Code : Tout sélectionner

if (devicechanged['PIR'] == 'On'  and uservariables["reset_vocal"]==0 )
then 
one=tostring(1)
commandArray['Variable:reset_vocal']= (one) --on met la variable à 1 pour n'avoir le message qu'une fois par jour
message = "     blablabla    "
os.execute('/home/pi/domoticz/scripts/izsynth -e naturalreaders -v Bruno  -t "'..message..'"  -r')
end

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 15:11
par vil1driver
Salut,

Pour commencer au lieu de faire un tostring(1), tape simplement '1' ;)

Pareil pour ton test, une 'variable utilisateur' étant toujours une chaîne teste == '0' c'est mieux...

Pour ton souci à tu vérifié les heures de mise à jour de ta variable par rapport à celle de détection de mouvement ?
Car ce n'est pas normal du tout que ce soit long à ce point..

Tu peux également tenter de passer par l'api json pour la mettre à jour.

Mais je pense que le soucis vient de ta commande os.execute qui doit durer trop longtemps.
Le script attend la fin de cette commande pour mettre ta variable à jour... voir même pas du tout si ça dépasse les 10 secondes..

Essai de terminer ta commande par un &, ça devrait aller nettement mieux ;)

Code : Tout sélectionner

os.execute('/home/pi/domoticz/scripts/izsynth -e naturalreaders -v Bruno  -t "'..message..'"  -r &')

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 16:28
par ganq
peux-tu mettre des prints entre les lignes pour vérifier que le script s'exécute jusqu'à la fin et mettre les logs pour faire le résultats ? (log de domoticz et du PIR)

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 17:08
par gawel3164
Merci pour vos réponses :)
Mon message vocal pouvant être parfois assez long, je pense que tu as raison Vil1driver, c'est le os.execute qui traine en longueur. Je pensais que le script mettait la variable à 1 avant la fin de l'instruction....Bêtement, je pensais qu'il exécutait les instructions dans l'ordre et au fur et à mesure....j'ai encore beaucoup de choses a apprendre! :lol: Bon, je retravaille tout ça et je vous dis si mon rasp a fini de bégayer !

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 18:12
par thier
Ton os.execute peut aussi être long si tu passe par internet pour ton tts.

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 18:21
par ganq
Si c'est cela, il faut lancer une commande externe (directement en sh) dans le lua qui se terminera plus vite
(peut-être besoin de mettre un & à la fin de la commande...)

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 20:08
par gawel3164
Je n'ai pas eu trop le temps d'approfondir ce soir, mais grâce a vos lumières, j'ai testé la chose suivante:
- Création d'un script lua qui détecte le passage à ON du PIR et qui met une première variable à 1 (je supprimerai les tostring(1), je le promets! ;) )

Code : Tout sélectionner

commandArray = {}
time = os.date("*t")(devicechanged['PIR'] == 'On' and uservariables["reset_variable"]==0)
then 
one=tostring(1)
commandArray['Variable:reset_variable']= (one)
end
return commandArray
- Dans mon script principal j'ajoute la nouvelle variable comme condition d'exécution

Code : Tout sélectionner

if (devicechanged['PIR'] == 'On'  and uservariables["reset_vocal"]==0 and uservariables["reset_variable"]==0)
then 
one=tostring(1)
commandArray['Variable:reset_vocal']= (one) --on met la variable à 1 pour n'avoir le message qu'une fois par jour
message = "     blablabla    "
os.execute('/home/pi/domoticz/scripts/izsynth -e naturalreaders -v Bruno  -t "'..message..'"  -r')
end
Testé rapidement, ça ne délivre le message qu'une seule fois. Le passage à 1 de la variable dans le premier script étant rapide, ça laisse le temps au reste de dérouler. Peut être à peaufiner ou à mettre sous une autre forme...mais ça fonctionne ! Merci!! :)

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 20:12
par vil1driver
Tu sais tu avais juste à ajouter à ton script le & comme je te l'ai indiqué ;) et c'était réglé

Mais content que ça fonctionne pour toi maintenant

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 20:17
par gawel3164
En fait j'avais simplifié mon script pour vous expliquer... :? En effet, j'ai plusieurs messages vocaux qui se suivent....et avec le &, ils se marchaient sur les pieds. Sinon, effectivement, avec une seul message ça marchait bien.

Re: variable utilisateur trop lente

Publié : 29 nov. 2016, 20:19
par vil1driver
Ah d'accord :D

Mais méfie toi, tout script lua dépassant 10 secondes est killé par domoticz..