Page 1 sur 1

Script blocky avec condition de temps ?

Publié : 10 févr. 2019, 22:07
par zemax_59
Bonjour,

Nouveau sur Domoticz suite à l’arrêt des serveurs de la Zibase programmé pour mars, j'ai repris tous mes modules Z-wave sur ce nouveau système sans problème.

Parmi eux, j'ai un FGBS-001qui me renvoie l'état de ma porte d'entrée (ouverte ou fermée). Je souhaiterais mettre en place un script qui, quand ma porte d'entrée est ouverte depuis plus de 5 mn, et en fonction de certaine conditions (s'il fait froid ou s'il pleut dehors), m'envoie un avertissement.

Là où je bloque c'est comment configurer ces fameuses 5 mn en Blocky.
Je précise que je ne maîtrise pas du tout le lua, au mieux, je peux comprendre quelques commande, d'où mon orientation première sur le blocky.
Est-ce possible ou dois-je nécessairement passer en lua pour ce type de conditions ?

Merci

Re: Script blocky avec condition de temps ?

Publié : 17 févr. 2019, 01:11
par zemax_59
Bonjour,

J'imagine que vu le nombre de réponse, et de ce que j'ai pu lire sur certains post, ce n'est pas possible de configurer ce genre de requete sur Blocky.

J'ai donc attaqué le problème en lua, malgré mon faible niveau.

En fouillant un peu partout sur le forum et le wiki, je pense que j'ai réussi à faire ce que je souhaitais.
Je vais par la suite tenter de l'améliorer avec des conditions de températures (si dehors il fait +/-1°C par rapport à dedans, c'est pas trop un problème)

Code : Tout sélectionner


commandArray = {}

function timedifference(timestamp)
  y, m, d, H, M, S = timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
  difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
  return difference
end

local s = otherdevices_lastupdate['Porte entrée']

local mydevice_changed = false

if (devicechanged ~= nil and devicechanged['Porte entrée']) then
    mydevice_changed = true
end

if(otherdevices['Porte entrée']=='Open' and timedifference(s) > 300 and not mydevice_changed) then
  commandArray['SendNotification']='Alerte porte entrée#La porte d\'entrée est ouverte depuis 5 minutes!#0#sound#extradata#http'
end

return commandArray
En le testant, il fonctionne sans problème. Par contre, comme le script est utilisé en mode "all", une fois les 5 mn dépassées, si la porte est toujours ouverte, je reçois une notification à chaque fois qu'un capteur ou un actionneur agit, ce qui est plutôt embêtant...

Et là, je sèche pour savoir comment limiter l'envoi de notification à 1 seule, (ou alors toutes les 5 mn). Quelqu'un aurait une idée ?
Merci

Re: Script blocky avec condition de temps ?

Publié : 17 févr. 2019, 01:30
par cyberbob
Salut,

Exact, pour le blocky c'est simple mais très limité, lorsque l'on veut aller plus loin, c'est obligatoire de faire des script LUA (ou autre langage)
Et tu as bien commencé, en lisant et rechercher sur ce forum et autre, Mais il faudra encore beaucoup lire et chercher il y a beaucoup a apprendre quand on débute ...

Pour ne pas que le script s’exécute toute les minutes (tout dépend ce que l'on veut faire), il ne faut pas mettre le script en All, ou time, mais en "device" et dans le script faire un :
if devicechanged['mon capteur']=='On' then ......

Il ne seras exécuté seulement si "mon capteur" passe a On
On peut aussi jouer avec la fonction "timedifference" si un capteur n'a pas été changer depuis xx secondes ...

Moi c'est ce que j'ai fait. Bonne chance.

Re: Script blocky avec condition de temps ?

Publié : 22 févr. 2019, 14:51
par landaisbenj
Hello.

Je ne suis pas trop d'accord. Pour ne pas que le script s'execute toutes les minutes ce n'est pas une question de type "device".

C'est juste une question de condition.

Si tu ne veux en faire qu'un seul, il faut effectivement faire un all, et avoir une parti qui détecte le changement d’état du device, et l'autre qui détectera toutes les minutes si le temps est supérieur a 5 minutes. Sauf que dans le cas de la parti time, tu auras forcement un log d'erreur de la parti device.
Car la parti device te donne un device qui change, alors que la parti time n'a pas de device qui change.. (je ne sais pas si je suis clair).

Du coup je suis impressionné que tu ais réussi a trouver l'idée de vérifier si le devichanged était vide. Je n'avais pas encore vu ca.

Une meilleure façon serait aussi de le faire en dzvent, qui permet une meilleure gestion des conditions time ou device.

Pour ton problème de notification, il faut que tu indique a ton script que tu as déjà fais une notification, et donc que tu ne veux pas en refaire (ou alors a un autre moment).
Tu devrais pouvoir trouver ca.

Re: Script blocky avec condition de temps ?

Publié : 09 mars 2019, 23:43
par zemax_59
Hello
landaisbenj a écrit :Du coup je suis impressionné que tu ais réussi a trouver l'idée de vérifier si le devichanged était vide. Je n'avais pas encore vu ca.
Merci beaucoup pour ce compliment, mais je n'ai aucun mérite : j'ai trouvé ces lignes en fouillant dans le wiki de Domoticz 8-)
Pour ton problème de notification, il faut que tu indique a ton script que tu as déjà fais une notification, et donc que tu ne veux pas en refaire (ou alors a un autre moment).
Tu devrais pouvoir trouver ca.
Par rapport à cela, je me demandais : y a-t-il une possibilté d'acceder au timing de la dernière notifiaction envoyée ? un truc du style

Code : Tout sélectionner

n = otherdevices_lastupdate['SendNotification']
Cela permettrai de ne plus notifier pendant un temps défini, en ré-utlisant la fonction 'timedifference'. Je ne sais pas si je suis très clair, il est tard...

Merci

Re: Script blocky avec condition de temps ?

Publié : 10 mars 2019, 11:26
par landaisbenj
Je ne pense pas que ce soit possible. Il faut à mon avis il vas falloir que tu passe par une variable utilisateur. Tu remplis la variable au moment où tu fais la notification, et c'est sur la variable que tu vérifier tes conditions. Et après tu peux mettre une raz de ta variable au bout d'un certain temps

Re: Script blocky avec condition de temps ?

Publié : 17 avr. 2019, 19:44
par zemax_59
Hello,

Je n'ai pas eu trop de temps de me pencher sur le sujet ces derniers temps, mais j'ai fais de nouveaux essais ce jour.
landaisbenj a écrit :Tu remplis la variable au moment où tu fais la notification, et c'est sur la variable que tu vérifier tes conditions. Et après tu peux mettre une raz de ta variable au bout d'un certain temps
.

Alors c'est ce que j'ai essayé de faire, en 2 scripts. Le premier, le principal est en "all" :

Code : Tout sélectionner

commandArray = {}

--Calcul de la différence de temps (en secondes)
function timedifference(timestamp)
  y, m, d, H, M, S = timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
  difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
  return difference
end

local s = otherdevices_lastupdate['Porte entrée']
local mydevice_changed = false

if (devicechanged ~= nil and devicechanged['Porte entrée']) then
    mydevice_changed = true
end


--si depuis 5mn, la porte est restée ouverte et qu'on n'a pas encore prévenu (j'ai réduit à 10s pour le test)
if(otherdevices['Porte entrée']=='Open' and timedifference(s) > 10 and not mydevice_changed and not avertissement) then
    
    --envoie un sms
    commandArray['SendNotification']='Alerte porte entrée#La porte d\'entrée est ouverte depuis 5 minutes!#0#sound#extradata#http'
    -- fait parler la tablette murale
    commandArray['OpenURL'] = 'http://192.168.1.12:8080/api/rest/speech/tts?text=Attention!La%20porte%20est%20ouverte%20depuis%205%20minutes!&&vol=80'
    -- retient que l'avertissement a été fait
    avertissement = true

end

return commandArray
Le deuxième est un script "time" qui va me servir à ré-initialiser la variable d'avertissement, de sorte que je ne sois prévenu qu'une fois par minute. Attention, celui-là j'ai été le chercher très loin... :D

Code : Tout sélectionner

commandArray = {}
avertissement = false
return commandArray

Le problème est que je l'ai testé mais c'est comme si il ne tenait pas compte de la variable "avertissement" : je reçois 12 sms d'un seul coup si mes devices se mettent à jour...
Y a-t-il un truc que je fais mal ?
Merci pour votre aide.

Re: Script blocky avec condition de temps ?

Publié : 17 avr. 2019, 20:15
par landaisbenj
Pas mal. Mais ces variables ne sont pas les meme.

Tu as la variable interne au premier script. Et tu as la variable interne au deuxième script. Les script ne communique pas entre eux. Et c'est pour ça qu'il existe les variables utilisateurs.

Si tu test l'existence, ou le contenu de la variable aux débuts des scripts, tu verras qu'elle n'existe jamais.

Regarde côté variables utilisateurs.

Re: Script blocky avec condition de temps ?

Publié : 17 avr. 2019, 21:52
par zemax_59
Bah voilà !!!

Merci pour ces éclaircissements. Je pensais que si je ne mettais pas 'local' devant le nom de la variable, elle était transposable sur tous les scripts...

Voici donc, pour ceux que ça intéresse, le code final qui fonctionne. Merci beaucoup @landaisbenj pour ton aide.

Script lua principal en mode "all"

Code : Tout sélectionner

commandArray = {}

--Calcule la différence de temps (en secondes)
function timedifference(timestamp)
  y, m, d, H, M, S = timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
  difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
  return difference
end

local s = otherdevices_lastupdate['Porte entrée']
local mydevice_changed = false

if (devicechanged ~= nil and devicechanged['Porte entrée']) then
    mydevice_changed = true
end


--si depuis 5mn, la porte est restée ouverte et qu'on n'a pas encore prévenu
if(otherdevices['Porte entrée']=='Open' and timedifference(s) > 300 and not mydevice_changed and uservariables["avertissement"] == "Non") then
    
    --envoie un sms
    commandArray['SendNotification']='Alerte porte entrée#La porte d\'entrée est ouverte depuis 5 minutes!#0#sound#extradata#http'
    -- fait parler la tablette murale
    commandArray['OpenURL'] = 'http://192.168.1.12:8080/api/rest/speech/tts?text=Attention!La%20porte%20est%20ouverte%20depuis%205%20minutes!&&vol=80'
    -- retient que l'avertissement a été fait
    commandArray['Variable:avertissement'] = 'Oui' 

end

return commandArray
et pour la réinitialisation de la variable toutes les minutes, lua en mode "time" :

Code : Tout sélectionner

-- sert à réinitialiser l'avertissement de la porte pour qu'il ne previenne qu'1 fois par minute
commandArray = {}

commandArray['Variable:avertissement'] = 'Non' 

return commandArray
Je vais continuer à essayer de l'améliorer, en ajoutant des conditions de températures entre dehors et dedans, pour que je sois prévenu plutôt en hiver ou quand il fait froid.

Re: Script blocky avec condition de temps ?

Publié : 17 avr. 2019, 22:34
par landaisbenj
Oui ça aurait été bien comme ça. Mais ce n'est pas le cas. Par contre en dzvent c'est possible.