Aller au contenu
flamalex

Allumage Si Detection De Mouv/extinction Si Abs Mouv

Recommended Posts

Bonjour,

 

après avoir écumé les sujets et en essayant de faire un "mix", je n'arrive pas à  atteindre mon but.

en effet, je souhaite une scène en LUA permettant de:

 

si entre 20h et 21h

et luminosité < à  1 Lux ID92 (FGMS001 Motion Sensor) 

 

et détection de mouvement ID90 (FGMS001 Motion Sensor)

alors allumer la lumière de l'escalier ID88 (FGD211 Dimmer)

à  10%

 

si absence de mouvement pendant 5 secondes

alors Éteindre cette lumière ID88

 

je vous remercie par avance pour votre aide

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans les tutos il y a un sujet sur settimeout qui devrait t'aider.

Partager ce message


Lien à poster
Partager sur d’autres sites

merci,

je viens de chercher "settimeout" mais rien sur le site.

alors je cherche peut etre mal

mais franchement, apres plus d un mois de recherche

avec des bouts de codes àdroite àgauche

j apprécierais un code complet qui correspond àmon scenario

Partager ce message


Lien à poster
Partager sur d’autres sites

j apprécierais un code complet qui correspond à  mon scenario

 

C'est pas vraiment le but du forum.

 

Tu peux faire une scène en mode block de ton problème, puis tu fais un passage en LUA et tu essayes de comprendre.

J'ai beaucoup appris en faisant cela.

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est pas vraiment le but du forum.

Tu peux faire une scène en mode block de ton problème, puis tu fais un passage en LUA et tu essayes de comprendre.

J'ai beaucoup appris en faisant cela.

c est en effet ce que j ai fait

en mode bloc impossible avec mon scenario

....5 sec.... dites moi comment vous faites

je ne vois pas l interet d un forum si a un moment on ne peut pas mettre les choses a plat.

pour d autres sujets je suis le premier a donner la solution a qqun qui cherche depuis plusieurs mois

domage qu on ne puisse pas le faire pour moi

j y penserai la fois prochaine (a l inverse)

Partager ce message


Lien à poster
Partager sur d’autres sites

Demander de l'aide c'est une chose, décrire son problème en disant faites moi le script en est une autre.

 

Voilà  comment en mode bloc on éteint une lampe avec un délai.

 

post-1115-0-96709000-1444809367_thumb.jpg

 

5s me semble un peu court. Va voir les paramètres de ton détecteur.

Partager ce message


Lien à poster
Partager sur d’autres sites

merci,

je viens de chercher "settimeout" mais rien sur le site.

alors je cherche peut etre mal

mais franchement, apres plus d un mois de recherche

avec des bouts de codes à  droite à  gauche

j apprécierais un code complet qui correspond à  mon scenario

 

@flamalex Je rejoins Berale24... Je pense que dans ta formulation "j'apprécierais un code' :  ... tu as manqué un peu de tact ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

 

Je rejoins Berale et chrispec, tu aurias mis un ptit debut de code ;-)

 

en reprenant vite fait le code de Berale24, j'aurais tenté ca, non testé !!!

 

Amuse toi bien


--[[
%% properties
90 value

%% globals
--]]

-- Si scene deja en cours, arret

if fibaro:countScenes()>1 then
  fibaro:debug("Scene déjà  en cours, arrêt")
  fibaro:abort()
end


local luminosite = tonumber(fibaro:getValue(92, "value"))
local mouvement = tonumber(fibaro:getValue(90, "value"))
local now = tonumber((os.date("%H")))


fibaro:debug("Heure actuelle" : ..now)

if ((now >= "20" and now <= "21") and (luminosite < "1") and (mouvement = "1")) then
    fibaro:call(88, "setvalue", "10")
end

setTimeout(function()
 local delayedCheck0 = false;
 local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value")
 
 fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0)
 
 if (mouvement = "0" and (os.time() - deviceLastModification0) >= 120) then
    delayedCheck0 = true;
 end
 
 if ( delayedCheck0 == true ) then
    fibaro:call(88, "turnOff")
 end
 
 end,120000)   

Partager ce message


Lien à poster
Partager sur d’autres sites

autant pour moi

je ne me suis par relu

et je vous prie de m en excuser

ce n etait pas un "ordre" mais plutot un souhait

de qqun qui cherche, surmnt mal, mais qui cherche et finit par etre desesperé

bref

dsl

en meme tps, je ne vois pas l interet de venir pour la premiere fois sur ce forum et etre malhonnête

ce n est pas mon but

j en suis désolé.

je reviendrai ce soir pour la partie technique apres test

merci a ts (dsl encore et aussi pour les abreviations, je me dépeche, mais je tenais àvous répondre)

Partager ce message


Lien à poster
Partager sur d’autres sites

Crois moi, l'entraide est le "maître" môt de ce forum.

 

Il est vrai que les admin, un peu vieux jeu, ne sachant pas toujours ce servir d'un ordi ou d'internet ...... (LOL) !!! ont mis au point la fonction "<>" qui permet d'insérer un code Lua dans les messages (beaucoup plus lisible, et surtout les autres peuvent le copier pour le modifier).

 

D'ailleurs, un exellent membre de ce forum m'avait à  l'époque dépatouiller avec une scène du même style ... je te la livre ci dessous.

--[[
%% properties
384 value
%% globals
--]]
 
local wallplug = 112
local mss = 384
local mss_lux = 386
 
local nom_variable_global = "Timerdate"
 
local heure = string.format(os.date("%H"), "%2d")..string.format(os.date("%M"), "%2d")
local heureValable = heure >= "1700" or heure < "0815"
 
-- local faibleLumiere = (tonumber(fibaro:getValue(mss_lux, "value")) < 30)
local enAlerte = (tonumber(fibaro:getValue(mss, "value")) > 0) 
 
-- A chaque fois que le détecteur sera en alerte et que la luminosité
-- sera faible, on va modifier la variable globale

if enAlerte and heureValable then
  	local extinction = os.time() + 150
	fibaro:setGlobal(nom_variable_global, extinction)
  	fibaro:debug("Extinction prévu à  " ..os.date("%X", extinction))
else
    fibaro:abort() 
end 
 
-- Si plus d'une scène tourne en même temps, on arrête celle-ci
if (fibaro:countScenes() > 1) then
  fibaro:abort()
end
 
-- On allume le bandeau
fibaro:call(wallplug, "turnOn")
fibaro:debug("Allumage à  " .. os.date("%X"))
 
-- On attends d'avoir atteint l'heure d'exctinction.
while (os.time() < tonumber(fibaro:getGlobalValue(nom_variable_global))) do
	fibaro:sleep(1000);
end
 
-- On éteint le bandeau
fibaro:call(wallplug, "turnOff")
fibaro:debug("Extinction à  " .. os.date("%X"))
 

un conseil, utilise ces différents solutions, en test, en en activant que l'une après l'autre (quoique a priori cela répondent au même besoin).

 

PS : j'ai toujours fibaro:sleep dans mes scènes au lieu de setimout, c'est grave ... ?? (quelle différence .?)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Settimeout c'est asynchrone, fonctionne totalement différemment de sleep

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai compris de puis peu :

sleep : arrete la lecture du script au sleep ;-)

 

settimeout permet de lire le script jusqu'a la fin sans arret ;-)

 

mais j'ai du mal à  l'utiliser c'est clair

Partager ce message


Lien à poster
Partager sur d’autres sites

merci PEPITE,

 

j'ai une erreur sur la ligne 26 ci dessous

"fibaro:debug("Heure actuelle" : ..now)"

 

" [ fatal] Runtime error: /opt/fibaro/scenes/101.lua:20: ')' expected near ':'[0m"

 
que veut dire cette erreur?
 
j'ai retiré les 2 points de suspensions en ligne 26
maintenant j'ai une erreur en ligne 29
 
merci
REM'S, je vais étudier ton script, merci
Alex

Partager ce message


Lien à poster
Partager sur d’autres sites

--[[
%% properties
90 value


%% globals
--]]


-- Si scene deja en cours, arret


if fibaro:countScenes()>1 then
  fibaro:debug("Scene déjà  en cours, arrêt")
  fibaro:abort()
end




local luminosite = tonumber(fibaro:getValue(92, "value"))
local mouvement = tonumber(fibaro:getValue(90, "value"))
local now = tonumber((os.date("%H")))
  
fibaro:debug("Heure actuelle" ..now)
if ((now >= "13"   and now <= "21") 
    and (luminosite < "6") 
    and (mouvement == "1"))
then    fibaro:call(88, "setvalue", "10")
end


setTimeout(function()
 local delayedCheck0 = false;
 local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value")


 fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0)


 if (mouvement == "0" and (os.time() - deviceLastModification0) >= 10) then
    delayedCheck0 = true;
 end


 if ( delayedCheck0 == true ) then
    fibaro:call(88, "turnOff")
 end


 end,10000)  

aprés avoir supprimé les 2 points en ligne 26 "fibaro:debug("Heure actuelle" ..now) " puis erreur sur la ligne 29 "and (mouvement == "1")) " parce qu'il fallait mettre 2 x "=" au lieu d'un seul idem en ligne 42 "if (mouvement == "0" "

bref j'ai de nouveau une erreur sur ligne 27  "if ((now >= "13"   and now <= "21") "

 [ fatal] Runtime error: /opt/fibaro/scenes/101.lua:27: attempt to compare string with number[0m

 

voila pourquoi je fais appel à  des experts, pcq pour trouver "2 points, et 2 =" moi il m'a fallu 2h, vous comprenez!!!!

maintenant je dois repartir

mais c'est comme cela dans ts les domaines, ts les métiers

chacun son truc 

Partager ce message


Lien à poster
Partager sur d’autres sites

desole, je l'ai ecris assez vite, j'ai fait des boulettes lol

je vais corriger ;-), desole de t'avoir fait perdre 2 h ;-)

 

Apres c'est avec des erreurs que l'on comprend l'erreur ;-)

 

Essaie comme ca :

--[[
%% properties
90 value

%% globals
--]]

-- Si scene deja en cours, arret

if fibaro:countScenes()> 1 then
  fibaro:debug("Scene déjà  en cours, arrêt")
  fibaro:abort()
end


local luminosite = tonumber(fibaro:getValue(92, "value"))
local mouvement = tonumber(fibaro:getValue(90, "value"))
local now = tonumber((os.date("%H")))
local heuredebut = 19
local heurefin = 21
local seuilluminosite = 1


fibaro:debug("Heure actuelle :" ..now)

if ((now >= heuredebut and now <= heurefin) and (luminosite < seuilluminosite) and (mouvement == "1")) then
    fibaro:call(88, "setvalue", "10")
end

setTimeout(function()
 local delayedCheck0 = false;
 local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value")
 
 fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0)
 
 if (mouvement == "0" and (os.time() - deviceLastModification0) >= 120) then
    delayedCheck0 = true;
 end
 
 if ( delayedCheck0 == true ) then
    fibaro:call(88, "turnOff")
 end
 
 end,120000)  

Il y a peut-etre encore des erreurs ;-) Desole d'avance ;-)

 
 
 

Partager ce message


Lien à poster
Partager sur d’autres sites

lol pepite, je ne disais pas cela pour ça :))))) :)

je teste 

rien ne se passe

message DEBUG

 
[DEBUG] 19:38:12: Scene déjà  en cours, arrêt
[DEBUG] 19:38:19: Temps écoulé 7
[DEBUG] 19:44:30: Heure actuelle :19
[DEBUG] 19:44:34: Scene déjà  en cours, arrêt
[DEBUG] 19:44:34: Scene déjà  en cours, arrêt
[DEBUG] 19:44:39: Scene déjà  en cours, arrêt
[DEBUG] 19:44:42: Temps écoulé 3
[DEBUG] 19:55:51: Heure actuelle :19
[DEBUG] 19:55:56: Scene déjà  en cours, arrêt
[DEBUG] 19:56:03: Temps écoulé 7
[DEBUG] 19:58:28: Heure actuelle :19
[DEBUG] 19:58:33: Scene déjà  en cours, arrêt
[DEBUG] 19:58:33: Scene déjà  en cours, arrêt
[DEBUG] 19:58:40: Temps écoulé 7
[DEBUG] 19:58:42: Heure actuelle :19
[DEBUG] 19:58:54: Temps écoulé 12
 
 

Pepite, j'aime bcp ton script pcq il est bien structuré, (logic pour moi)

j'essaie de comprendre plusieurs choses,

 

a quoi servent les lignes 11 à  14? si la scene est déja active alors on ne la relance pas, c'est bien ca?

 

je comprends que tu désignes des 'local" dans lesquels tu insères des données fonctions variables ou fixes, lignes 17 à  22

 

puis tu viens chercher l'heure actuelle pour la comparer aux heures de debut/fin pres enregistrées, lignes 25/27, démarrant ainsi la condition

si heure actuelle est située entre 19 et 21h et lumiere < 1 et mouv=1 alors on allume la lumiere à  10%, lignes 27,28 et 29

 

après les lignes 31 à  35, je ne comprends pas (ne serait ce pas, tant qu'il y a détection mouvement alors le compteur des 120 secs repart à  zero?)

 

puis 37 à  43, ok pour moi

 

la 45 avec 120000, je comprends pas non plus (un lien avec les 120 sec mais pourquoi x1000?)

Partager ce message


Lien à poster
Partager sur d’autres sites

Il faut enlever les lignes 11 à  14.

 

Au premier passage devant le fgms la scène démarre. Au passage suivant, si le délai n'est pas écoulé la lumière ne s’éteint pas mais il faut bien redémarrer une autre scène pour continuer le processus.

 

Revoir le sujet que j'avais fait sur la fonction settimeout et aussi le très bon tuto (mais en anglais) sur le forum officiel.

  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @Berale,

 

Une subtilité m'echappe alors ;-)

 

1er passage : scene demarre, allumage dimmer à  10 %

2eme passage : si dimmer allumé, 2eme instance arretee, le processus continue tout de meme non ? le settimeout de la 1ere instance continue tout de même ?

 

je en sais pas si je suis tres clair ;-)

 

merci pour tes explication et de dimmer ma lumiere à  + de 10 % stp ;) ;)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

 

Ca fonctionne ?

non pas encore

comme tu peux le voir dans mon message precedent,

on dirait que ca tourne en boucle

par contre chez moi "le 10% " ne fonctionne pas

(alors que module +bypass+ ampoule dimmable)

juste pour ca je fais les tests anvec "turnOn" pour momnt.

Partager ce message


Lien à poster
Partager sur d’autres sites

n'oublie pas d'enlever les lignes 11 à  14 comme le dit Berale24.

 

Que ca tourne c'est normal puisque cela attend les 120 ;-)

 

pas d'allumage de dimmer ? bizarre

Partager ce message


Lien à poster
Partager sur d’autres sites

n'oublie pas d'enlever les lignes 11 à  14 comme le dit Berale24.

 

Que ca tourne c'est normal puisque cela attend les 120 ;-)

 

pas d'allumage de dimmer ? bizarre

--[[
%% properties
90 value
92 value
%% globals
--]]


local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value");
local HeureActuelle = os.date("*t");
local mouvement = tonumber(fibaro:getValue(90, "value"));
local luminosite = tonumber(fibaro:getValue(92, "value"));
local seuilluminosite = 35; --luminosite 
local heuredebut = 14; --plage horaire
local heurefin = 21;
--local timeout = 6; --duree d'attente sans mouvement


--if (fibaro:countScenes() > 1) then fibaro:abort() end;


fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min'])
fibaro:debug("le capteur est safe depuis : "..((os.time() - deviceLastModification0)/60).." min")


if ((HeureActuelle['hour']>= heuredebut and HeureActuelle['hour'] <= heurefin) -- si heure actu est située entre 19 et 21h 
and
 ( mouvement > 0 )----detection de mouv
and
 ( luminosite <= seuilluminosite ))  --luminosité <=2Lux
then fibaro:call(88, "turnOn"); --allumage module eclairage à  10%
end


setTimeout(function()
local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(90, "value")


fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0)


if (( mouvement == 0 ) and (os.time() - deviceLastModification0) >= 6)
then delayedCheck0 = true;   ----si pas de mouv pdt 6 sec
end
    
if ( delayedCheck0 == true )
then fibaro:call(88, "turnOff") --extinction lumiere
end
end,12000)
j'ai modifié les plages horaires, le turnOn et luminosité ci dessus afin de faire test dans la journée.

pour le moment ca fonctionne, je testerai davantage ce soir, reste à  voir le probleme du dimmer 10%

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×