Script blocky avec condition de temps ?
Script blocky avec condition de temps ?
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
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
Domoticz sur Rpi+ RFXcom + Z-stick Gen5
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
Re: Script blocky avec condition de temps ?
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)
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
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
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
Domoticz sur Rpi+ RFXcom + Z-stick Gen5
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
Re: Script blocky avec condition de temps ?
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.
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.
Domoticz Stable V4.9700 sur Synology DSM 6.2 / 2 x RFlink V48.4 - 433.92MHz(Dio/Chacon) & 433.42MHz(RTS) / Script en LUA & Blocky
-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Script blocky avec condition de temps ?
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.
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.
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Re: Script blocky avec condition de temps ?
Hello
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
Merci beaucoup pour ce compliment, mais je n'ai aucun mérite : j'ai trouvé ces lignes en fouillant dans le wiki de Domoticzlandaisbenj 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.
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 stylePour 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.
Code : Tout sélectionner
n = otherdevices_lastupdate['SendNotification']Merci
Domoticz sur Rpi+ RFXcom + Z-stick Gen5
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Script blocky avec condition de temps ?
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
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Re: Script blocky avec condition de temps ?
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.
Alors c'est ce que j'ai essayé de faire, en 2 scripts. Le premier, le principal est en "all" :
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...
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.
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 commandArrayCode : 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.
Domoticz sur Rpi+ RFXcom + Z-stick Gen5
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Script blocky avec condition de temps ?
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.
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.
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Re: Script blocky avec condition de temps ?
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"
et pour la réinitialisation de la variable toutes les minutes, lua en mode "time" :
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.
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
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 commandArrayDomoticz sur Rpi+ RFXcom + Z-stick Gen5
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
Volets Somfy RTS - Vélux sur inverseur de polarité 24V (eMylo)
Interrupteurs et prises Di.O - modules Fibaro - Prises extérieures Phenix
Station Netatmo
-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Script blocky avec condition de temps ?
Oui ça aurait été bien comme ça. Mais ce n'est pas le cas. Par contre en dzvent c'est possible.
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway