SI X activé PENDANT Y seconde ALORS >impossible ?

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
alexbi
Messages : 123
Inscription : 29 nov. 2015, 16:36

SI X activé PENDANT Y seconde ALORS >impossible ?

Message par alexbi »

bonjour

voila je cherche a faire dans le events donc ce qu'on appel blocky (si j'ai tout compris désolé je débute...) ce que j'ai marqué dans le titre.

SI ma lumière de SDB est allumée pendant au moins 15 seconde alors j'allume le chauffage.

je pose la question car j'ai une HCL de chez fibaro est leur block comprends cette fonction

Image

merci pour votre aide
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par patrice »

Bonsoir

Les events (blockly dans Domoticz en effet) sont relativement basiques, bien qu'ils évoluent régulièrement, il ne permettent pas ce que tu souhaite faire.

Il faut ne pas hésiter à programmer le actions en Lua.
J'ai repris ce script depuis le wiki Domoticz et modifié comme ça au pif.

Adapte dedans le nom de tes matériels et teste le si ca marche correctement car je n'ai pas testé.

J'ai une Lumiere_Exterieur qui me déclenche au bout de 15 secondes le passage à On de "Prise Elect"
Ce script est a enregistrer dans domoticz/scripts/lua
sous le nom script_device_lumiere.lua
il se déclenche dés que Lumière_Exterieur change d'état (On,Off, remis à jour par qq chose d'autre ...)

Code : Tout sélectionner

t1 = os.time()
s = otherdevices_lastupdate['Lumiere_Exterieur']
-- returns a date time like 2013-07-11 17:23:12

year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)

commandArray = {}

t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = (os.difftime (t1, t2))
print (difference)
if (otherdevices['Lumiere_Exterieur'] == 'On' and difference > 15 and difference < 70) then
   commandArray['Prise Elect']='On'
end
if (otherdevices['Lumiere_Exterieur'] == 'Off') then
   commandArray['Prise Elect']='Off'
end

return commandArray

Quelques articles du blog ont traité de l'ecriture en Lua
http://easydomoticz.com/mon-premier-scr ... ondations/
http://easydomoticz.com/mon-premier-scr ... en-oeuvre/

Envoyé de mon GT-N7000 en utilisant Tapatalk
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
exosteph
Messages : 6
Inscription : 08 août 2015, 12:26

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par exosteph »

Bonjour Alexbi

Si tu veux créer une tempo, tu peux passer par un Virtual Switch que tu active 15 seconde après l'action dans les paramètres du switch lui même.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par vil1driver »

@Patrice,

Penses au rythme d'exécution des script_time 60s
Il ne faut pas être trop juste dans la plage de temps difference.
Si le script s'exécute entre 11 et 14 secondes de différence, le teste sup 15 inf 70 retourne false
À la prochaine exécution du script on aura
Difference +60 soit entre 71 et 74.
Le teste retournera de nouveau false.

On à statistiquement peu de risque de tomber dans ce cas de figure mais c'est toujours trop ;)

Il faut donc voir plus large, avoir toujours plus de 60s entre la limite basse et haute du test différence.

Ou faire en sorte de lancer le script plus régulièrement.
Exemple:
viewtopic.php?f=10&t=373
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par vil1driver »

L'objectif m'a amusé :)

Tu fais quoi dans ta salle de bain en moins de 15s ?
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
alexbi
Messages : 123
Inscription : 29 nov. 2015, 16:36

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par alexbi »

merci pour vos réponses !

oui je me suis dit que les blocky ne devait pas faire cette tempos donc j'ai regarder du coté LUA mais bon je voulais deja comprendre comment faire fonctionner un script sur domoticz et j'ai bien galéré (je ne mettais pas mes script dans le bon dossier vu que je suis sur un nas synology il y a deux dossiers pour les scripts qui est dans le dossier var ...).


@patrice
c'est super gentil de m'avoir fait une demo. Je suis aussi tombé sur ce topic mais je t'avoue que j'aime bien comprendre le cheminement du script et c’était plutôt vague mais bon faut y aller petit a petit. La avec cette exemple concret ca me parle deja plus !

@d'exosteph
c'est la premiere idée que j'ai eu et oui cela fonctionne mais je me suis juste imaginé le nombre de devices virtuel que je devrais créer et le bordel dans la page interrupteur (vu qu'on ne peux pas créer de pieces et organiser tout ca comme dans ma HCL) donc je suis passé a l'idée du LUA.

@ vil1driver
merci pour cette précision. Donc si je veux que cela fonctionne bien je doit mettre >15 et <75(au minimum). Ou passer par crontab dont je ne sais pas encore trop ce que c'est mais bon je m'y attelle car je met en place le google calendar donc va bien falloir que je comprenne lol. Ou passer par ton lien avec les virtuel switch

Code : Tout sélectionner

-- script_device_10s.lua
commandArray = {}
if (devicechanged['test'] == 'Off') then
commandArray['test']='On'

t1 = os.time()
s = otherdevices_lastupdate['Lumiere_Exterieur']
-- returns a date time like 2013-07-11 17:23:12

year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)

commandArray = {}

t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = (os.difftime (t1, t2))
print (difference)
if (otherdevices['Lumiere_Exterieur'] == 'On' and difference > 15 and difference < 76) then
   commandArray['Prise Elect']='On'
end
if (otherdevices['Lumiere_Exterieur'] == 'Off') then
   commandArray['Prise Elect']='Off'
end


return commandArray 

la tu pense que cela va bien fonctionner ?

et pour ta dernière question : Lorsque je rentre dans ma salle de bain SI j'allume la lumière et SI c'est juste pour me regarder dans le miroir voir si je suis toujours aussi beau en moins de 15 seconde ALORS je n'allume pas le radiateur de ma salle de bain/WC MAIS SI c'est pour couler un bronze alors la j'allume le radiateur car j'ai pas trop envie de me geler les fesses sur le trône LOL.
ben33880
Messages : 268
Inscription : 13 nov. 2014, 21:12

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par ben33880 »

sinon tu as la commande "at" qui te permet de lancer une commande à une heure donnée ( now + 1 minutes par exemple), mais c'est du shell pas du lua.

en gros un premier script qui dit de lancer un autre script dans x secondes, ce second script devra vérifier que ta lampe est allumée et si oui allume ton chauffage.
alexbi
Messages : 123
Inscription : 29 nov. 2015, 16:36

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par alexbi »

encore moi

bon le script fonctionne tres bien mais j'ai plein de log je pense que c'est le calcul du diff mais cela ne semble jamais s'arreter c'est normale ?

script :

Code : Tout sélectionner

t1 = os.time()
s = otherdevices_lastupdate['eclairage_SDB']
-- returns a date time like 2013-07-11 17:23:12

year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)

commandArray = {}

t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = (os.difftime (t1, t2))
print (difference)
if (otherdevices['eclairage_SDB'] == 'On' and difference > 15 and difference < 81) then
   commandArray['chauffage_SDB']='On'
end
if (otherdevices['eclairage_SDB'] == 'Off') then
   commandArray['chauffage_SDB']='Off'
end
return commandArray

log :

Code : Tout sélectionner

2015-12-17 14:13:38.534 EventSystem: Script event triggered: /usr/local/domoticz/var/scripts/lua/script_device_tempo_radiateur_SDB.lua
2015-12-17 14:13:38.528 (Dummy) Lighting 1 (chauffage_SDB)
2015-12-17 14:13:39.543 LUA: 81
2015-12-17 14:13:39.536 (Dummy) Lighting 1 (chauffage_SDB)
2015-12-17 14:13:46.708 LUA: 88
2015-12-17 14:13:46.703 (z-wave.me) Lux (luminosité SDB)
2015-12-17 14:13:46.736 LUA: 88
2015-12-17 14:13:46.731 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:13:46.768 LUA: 88
2015-12-17 14:13:46.763 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:14:16.708 LUA: 118
2015-12-17 14:14:16.703 (z-wave.me) Lux (luminosité SDB)
2015-12-17 14:14:16.740 LUA: 118
2015-12-17 14:14:16.735 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:14:16.768 LUA: 118
2015-12-17 14:14:16.763 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:14:46.712 LUA: 148
2015-12-17 14:14:46.707 (z-wave.me) Lux (luminosité SDB)
2015-12-17 14:14:46.740 LUA: 148
2015-12-17 14:14:46.735 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:14:46.772 LUA: 148
2015-12-17 14:14:46.767 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:15:16.716 LUA: 178
2015-12-17 14:15:16.711 (z-wave.me) Lux (luminosité SDB)
2015-12-17 14:15:16.744 LUA: 178
2015-12-17 14:15:16.739 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:15:16.776 LUA: 178
2015-12-17 14:15:16.771 (z-wave.me) Temp + Humidity (temp/hum SDB)
2015-12-17 14:15:46.720 LUA: 208
2015-12-17 14:15:46.715 (z-wave.me) Lux (luminosité SDB)
2015-12-17 14:15:46.748 LUA: 208
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par patrice »

Bonjour
Oui c'est normal puisque tu as un print (difference) dans ton script

mets -- devant la ligne et ca ne sort plus dans le log
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
alexbi
Messages : 123
Inscription : 29 nov. 2015, 16:36

Re: SI X activé PENDANT Y seconde ALORS >impossible ?

Message par alexbi »

ok merci donc c'est normale

ba dis donc on s'en rend pas conte mais il a du boulot domoticz j’imagine si on fait 20 scripts dans le genre ...


mais il n'y a pas un vraie site ou on peu retrouver l'ensemble des commandes que l'on peux utiliser en LUA car je ne vois que des site avec des exemples !

par exemple sur la forme du script je trouve rien. SI on met un "if" on doit le finir par un "end" (c'est ce que j'ai compris) mais je vois des exemples avec plusieurs "end" a la fin. Je voulais aussi mettre une condition "if" avant le "t1 = os.time()" pour ne pas faire travailler la machine si ma lumiere de SDB n'est pas allumer ... Mais je n'ai pas réussi... peut être impossible ?
Répondre