Lionel57 Posté(e) le 21 septembre 2014 Signaler Posté(e) le 21 septembre 2014 Le but de ce script est de gérer l’allumage automatique des lumières (la nuit => bascule jour/nuit géré par une scène) et leur extinction si aucun mouvement détecté dans un laps de temps défini, tout en conservant la possibilité de désactiver cet automatisme. La fonction se décompose en une scène qui gère l’allumage et l’extinction et en un module virtuel pour le réglage des paramètres. A chaque déclenchement, les lumières passent à ON et un compteur est incrémenté. Ce compteur est décrémenté après le délai fixé, si ce compteur est à 0, alors les lumières passent à OFF. Peut être il existe une solution plus simple, mais c’est la seule solution que j’ai trouvé pour repartir sur un nouveau délai avant extinction sans toucher au statut ARMER/DESARMER de mes capteurs de mouvements (le statut ARMER pour les alarmes, le statut DESARMER pour l'éclairage) Après de nombreuses recherches, je n’avais pas trouvé le script qui convenait. Pour ce faire, pour chaque pièce, je crée 3 variables (exemple pour salon) - Salon => le compteur - Duree_Salon => durée en minutes avant extinction - Salon_Allum_Auto (oui/non) => allumage/extinction actif (ou non) Scène Allumage Auto --[[ %% autostart %% properties 46 value 46 armed %% globals Jour_Nuit --]] local startSource = fibaro:getSourceTrigger(); if ( ( (tonumber(fibaro:getValue(46, "value")) > 0 and tonumber(fibaro:getValue(46, "armed")) == 0) and fibaro:getGlobalValue("Jour_Nuit") == "Nuit" and fibaro:getGlobalValue("Salon_Allum_Auto") == "Oui" ) or startSource["type"] == "other" ) then fibaro:setGlobal("Salon", tonumber(fibaro:getGlobalValue("Salon")) + 1); fibaro:call(17, "turnOn"); fibaro:call(20, "turnOn"); setTimeout(function() fibaro:setGlobal("Salon", tonumber(fibaro:getGlobalValue("Salon")) - 1); if ( tonumber(fibaro:getGlobalValue("Salon")) == tonumber("0") and fibaro:getGlobalValue("Salon_Allum_Auto") == "Oui" ) then fibaro:call(17, "turnOff"); fibaro:call(20, "turnOff"); end end, tonumber(fibaro:getGloabalValue("Duree_Salon")) * 60 * 1000) end ​Module virtuel Activation Allum Auto Création d’un label (Allum Auto), d’une zone 2 boutons et d’un slider Code Lua bouton ON local id = fibaro:getSelfId() local temp = "Oui" fibaro:call(id,"setProperty","ui.Label1.value",temp) fibaro:setGlobal("Salon_Allum_Auto", temp) Code Lua bouton OFF local id = fibaro:getSelfId() local temp = "Non" fibaro:call(id,"setProperty","ui.Label1.value",temp) fibaro:setGlobal("Salon_Allum_Auto", temp) Code Lua slider fibaro:setGlobal("Duree_Salon", _sliderValue_) Code Lua boucle principale local id = fibaro:getSelfId() local temp = fibaro:getGlobalValue("Salon_Allum_Auto") local duree = fibaro:getGlobalValue("Duree_Salon") fibaro:call(id,"setProperty","ui.Label1.value",temp) fibaro:call(id,"setProperty","ui.Slider1.value",duree) En espérant que ma contribution pourra aider certains et en attente de vos commentaires pour améliorer tout ça. 2
Moicphil Posté(e) le 21 septembre 2014 Signaler Posté(e) le 21 septembre 2014 Merci pour le partage. Peut tu éditer ton message et utiliser les balises pour le code ? <>
Lionel57 Posté(e) le 21 septembre 2014 Auteur Signaler Posté(e) le 21 septembre 2014 C'est fait, j'aurais appris quelques choses, je ne ferai plus la même erreur...
cyssou Posté(e) le 22 septembre 2014 Signaler Posté(e) le 22 septembre 2014 J'ai fais un petit test de ton systéme "Allumage/extinction automatique des lumières" qui chez moi pour l'instant ne fonctionne pas. Par contre 2 choses que j'ai trouvé. La variable Durée_Salon , il faut la crée sans accent donc cela donne Duree_Salon et dans la "Scène Allumage Auto" ligne 30 end, tonumber(fibaro:getGloabalValue("Duree_Salon")) * 60 * 1000) il y a une erreur sur getGloabalValue il y a un "a" en trop, cela donne donc: end, tonumber(fibaro:getGlobalValue("Duree_Salon")) * 60 * 1000) Le reste qui coince pas encore trouvé...
Lionel57 Posté(e) le 23 septembre 2014 Auteur Signaler Posté(e) le 23 septembre 2014 Hello, C'était mon premier post, pas habitué à poster sur un forum, il faut un début à tout, moicphil m'a d'ailleurs demandé (et tuyauté) pour mieux présenter mon code. Effectivement, il y avait des erreurs de recopiage, maintenant que je me familiarise avec le forum, j'ai fait un copier-coller. Ce code fonctionne chez moi, donc si je peux t'aider... Aujourd'hui, j'ai adapté mon code. Depuis quelques jours, en plus du mode "Jour" et "Nuit", j'ai créé un mode "Dodo". Après 10 minutes dans ma chambre, sans mouvement dans le reste de l'appart, ce n'est plus l'éclairage traditionnel qui s'allume mais une rampe de Led (beaucoup moins violent pour les yeux pour les petits besoins noctures). Plusieurs tests successifs et je persiste, ça fonctionne. Mais j'avoue, au départ, j'ai fait du recopiage, là , c'est un copié/collé (en recopiant, vite fait de faire une boulette, LUA est très sensible à la casse, je viens d'en refaire l'expérience
bencol Posté(e) le 18 novembre 2014 Signaler Posté(e) le 18 novembre 2014 Bonjour Je ne comprends pas d'où sort la fonction setimeout. C'est du javascript pas du LUA ?
Krikroff Posté(e) le 18 novembre 2014 Signaler Posté(e) le 18 novembre 2014 @bencol, non setimeout c'est bien ici du LUA mais uniquement disponible avec les nouvelles libs de la V4 , il faut utiliser a la place une méthode avec fibaro:sleep(xxx) en V3.5xxx @Lionel57, bravo et merci pour le partage. Attention, ton code ne risque-t-il d'avoir des comportements erratiques en cas de multiple déclenchement ? (il me semble)
bencol Posté(e) le 18 novembre 2014 Signaler Posté(e) le 18 novembre 2014 Merci pour la réponse. J'aurais bien présenté ma méthode mais comment présente t'on du code dans une réponse ? désolé je débute sur le forum.
julix Posté(e) le 20 novembre 2014 Signaler Posté(e) le 20 novembre 2014 (modifié) Merci pour la réponse. J'aurais bien présenté ma méthode mais comment présente t'on du code dans une réponse ? désolé je débute sur le forum. Simplement utiliser le bouton "Ajouter" en bas à droite du post Bien à toi J Modifié le 20 novembre 2014 par moicphil Bonjour, merci de ne pas citer un message situé juste au dessus.
bencol Posté(e) le 20 novembre 2014 Signaler Posté(e) le 20 novembre 2014 Voilà ma solution (je suis un peu ému, c'est la première fois que je publie, j'ai reçu ma HC2 il y a une semaine ) Je n'utilise pas de scènes mais un module virtuel uniquement. L'objectif est de piloter un éclairage (via wallplug) soit par un détecteur soit par un bouton sur l'interface avec un timer d'extinction qui se prolonge aussi longtemps qu'il y a une détection (ou bien que l'on éteigne par le bouton). J'ai 2 variables globales : - LampeSalonTV_Duree - LampeSalonTV_Timer J'ajoute un bouton à ce module qui contient le code suivant : -- Wallplug : id6 local selfId = fibaro:getSelfId(); if (fibaro:getValue(6, "value")=='0') -- lampe éteinte then -- modif icone allumé fibaro:call(selfId, "setProperty", "currentIcon", 1011); -- allumage lampe fibaro:call(6, "turnOn"); -- initialisation du timer fibaro:setGlobal("LampeSalonTV_Timer", fibaro:getGlobalValue("LampeSalonTV_Duree") * 60); else -- modif icone éteint fibaro:call(selfId, "setProperty", "currentIcon", 1012); -- extinction lampe fibaro:call(6, "turnOff"); -- affichage message fibaro:log("Lampe éteinte."); end puis dans le main loop je mets : -- Wallplug : id6 -- Détecteur : id15 -- déclaration des variables local selfId = fibaro:getSelfId(); local Seuil = 10; -- seuil de luminosité en lux local Maintenant = os.date("*t"); -- Gestion de l'extinction if (fibaro:getValue(6, "value") == '1' ) -- lampe allumée then -- décrémentation du compteur (par pas de 3s car mainloop toutes les 3s) fibaro:setGlobal("LampeSalonTV_Timer", tonumber(fibaro:getGlobalValue("LampeSalonTV_Timer")) - 3); -- affichage du temps restant fibaro:log("Extinction dans " ..fibaro:getGlobalValue("LampeSalonTV_Timer") .." s"); -- si timer vidé => extinction de la lampe if (tonumber(fibaro:getGlobalValue("LampeSalonTV_Timer")) <= 0) then fibaro:call(selfId, "setProperty", "currentIcon", 1012); -- modif icone éteint fibaro:call(6, "turnOff"); -- extinction lampe fibaro:log("Lampe éteinte."); -- affichage message end end -- Gestion d'une détection de mouvement if (fibaro:getValue(15, "value") == '1' -- mouvement détecté and tonumber(fibaro:getValue(17, "value")) <= Seuil -- luminosité faible and (Maintenant['hour'] >= 16 or Maintenant['hour'] <= 1)) -- heure > 19 h et heure < 1 h du matin then -- initialisation du timer fibaro:setGlobal("LampeSalonTV_Timer", fibaro:getGlobalValue("LampeSalonTV_Duree") * 60); -- modif icone allumé fibaro:call(selfId, "setProperty", "currentIcon", 1011); -- allumage lampe fibaro:call(6, "turnOn"); end Bon, je laisse aux experts le soin de me dire si cette solution est nickel ou pas. En attendant elle fonctionne parfaitement. 1
Krikroff Posté(e) le 20 novembre 2014 Signaler Posté(e) le 20 novembre 2014 Pour moi les variables globales sont inutiles, d'ailleurs je n'en utilise pas dans mes scripts de détections avec Timer, même Timer dynamiques, auto-off etc... Que le code soit dans une scène ou bien un vd. Ton code fonctionne mais utilise des ressources du HC2 inutilement, en même temps il en a sous le pied le HC2
bencol Posté(e) le 21 novembre 2014 Signaler Posté(e) le 21 novembre 2014 ?? mais alors comment fais tu dans le cas ci-dessus pour partager une variable entre 2 scripts à savoir "LampeSalonTV_Timer" dans mon cas. L'autre variable est effectivement superflue si on fixe sa valeur directement dans le script.
Krikroff Posté(e) le 21 novembre 2014 Signaler Posté(e) le 21 novembre 2014 il me semble en lisant ton script qu'il a toujours la même valeur non, le résultat de fibaro:getGlobalValue("LampeSalonTV_Duree") * 60 ou je suis passé àcôté de quelque chose ?
bencol Posté(e) le 21 novembre 2014 Signaler Posté(e) le 21 novembre 2014 oui, cette variable (qui est d'ailleurs plutôt une constante) est fixe. Par contre l'autre "LampeSalonTV_Timer" permet de décompter le compte à rebours et est commune aux 2 scripts.
Krikroff Posté(e) le 21 novembre 2014 Signaler Posté(e) le 21 novembre 2014 Dans ce cas une idée intéressante serait d' avoir plusieurs boutons: 10 mn / 30 mn etc... sinon si LampeSalonTV_Timer est toujours initialisée à la même valeur j'utiliserais plus une scène évitant déjà l'utilisation des variables et qui donne plus de possibilité de programmation: Trigger etc... Ton script correspond à ton besoin et c'est bien cela l'essentiel
angusperde Posté(e) le 26 juin 2015 Signaler Posté(e) le 26 juin 2015 Je bataille avec le FIBARO Temperature/Light SENSOR. Il est bien reconnu par mon HC2, mais tant le Maitre que les 3 capteurs sont indiqués : "non configurés". Faut-il les configurer ? comment le fait-on ? Je cherche des scènes les utilisant, je veux simplement dans un premier temps allumer une lumière quand l' intensité lumineuse de ma pièce est insuffisante. Merci votre aide,
q.philippe Posté(e) le 4 novembre 2015 Signaler Posté(e) le 4 novembre 2015 Salut Si c'est bien un Module Virtuel, peux tu le partager? voir son fonctionnement...ben
megabubu Posté(e) le 20 décembre 2015 Signaler Posté(e) le 20 décembre 2015 Je suis aussi preneur du VD comme le dirait q.philippe :-), si possible avec les conseils de Krikroff. :-)
hiphop Posté(e) le 5 novembre 2016 Signaler Posté(e) le 5 novembre 2016 Bonjour depuis hier soir je test cette méthode mais sa ne fonctionne pas chez moi. Je m'explique la lumière s'éteint correctement suivant le timer, mais elle ne s'allume pas sur détection de mouvement, ensuite j'ai un message d'erreur dans le debeugue. [DEBUG] 10:39:26: line 30: attempt to call method 'getGloabalValue' (a nil value) Voilà comment j'ai procédé : La scene --[[ %% autostart %% properties 46 value 46 armed %% globals Jour_Nuit --]] local startSource = fibaro:getSourceTrigger(); if ( ( (tonumber(fibaro:getValue(88, "value")) > 0 and tonumber(fibaro:getValue(88, "armed")) == 0) and fibaro:getGlobalValue("Jour_Nuit") == "Nuit" and fibaro:getGlobalValue("Parent_Allum_Auto") == "Oui" ) or startSource["type"] == "other" ) then fibaro:setGlobal("Chambre_parent", tonumber(fibaro:getGlobalValue("Chambre_parent")) + 1); fibaro:call(6, "turnOn"); fibaro:call(6, "turnOn"); setTimeout(function() fibaro:setGlobal("Chambre_parent", tonumber(fibaro:getGlobalValue("Chambre_parent")) - 1); if ( tonumber(fibaro:getGlobalValue("Chambre_parent")) == tonumber("0") and fibaro:getGlobalValue("Chambre_parent") == "Oui" ) then fibaro:call(6, "turnOff"); fibaro:call(6, "turnOff"); end end, tonumber(fibaro:getGloabalValue("Duree_Parent")) * 60 * 1000) end Les variables: Chambre_parent => le compteur Duree_parent => durée en minutes avant extinction Parent_Allum_Auto (oui/non) => allumage/extinction actif (ou non) ON local id = fibaro:getSelfId() local temp = "Oui" fibaro:call(id,"setProperty","ui.Label1.value",temp) fibaro:setGlobal("Parent_Allum_Auto", temp) OFF local id = fibaro:getSelfId(117) local temp = "Non" fibaro:call(id,"setProperty","ui.Label1.value",temp) fibaro:setGlobal("Parent_Allum_Auto", temp) SLIDER fibaro:setGlobal("Duree_parent", _sliderValue_) merci pour votre aide
Peter Posté(e) le 5 novembre 2016 Signaler Posté(e) le 5 novembre 2016 @hiphop Regarde dans l'en-tête tu a 46 value et 46 Armed Alors qu'àle ligne 14 ton module l'id 88 verifier le n° d'id de ton Detecteur et reporte le en en-tête et àla place des ID 88 Et pour ton message d'erreur il y a un "à" en trop àgetGlobalValue àla ligne 30 Moi je ne gère pas les Lumiere avec des Scènes mais avec Gea Voilàbonne journée
pepite Posté(e) le 5 novembre 2016 Signaler Posté(e) le 5 novembre 2016 (modifié) Bonjour, A tester mais tu as fait une faute d'orthographe :-) 'getGloabalValue' Pas vu que Peter avait repondu sur la faute aussi hihi Modifié le 5 novembre 2016 par pepite
Peter Posté(e) le 5 novembre 2016 Signaler Posté(e) le 5 novembre 2016 @pepite pour une fois plus rapide que toi 1
hiphop Posté(e) le 5 novembre 2016 Signaler Posté(e) le 5 novembre 2016 Merci pour votre aide je regarde sa demain àtête reposée
mprinfo Posté(e) le 18 janvier 2017 Signaler Posté(e) le 18 janvier 2017 moi j'utilise cela -[[ %% properties 117 value 127 value 196 value 347 value --]] if fibaro:getGlobalValue("Jour_Nuit") == "Jour" then fibaro:abort() end local trigger = fibaro:getSourceTrigger() if (trigger['type'] == 'property') then ID = tonumber(trigger['deviceID']) detection = tonumber(fibaro:getValue(ID, "value")) --print("ID du Module déclencheur = ", ID, " - Valeurs : ", detection) else fibaro:debug("La scéne ne peut être lancer que par un changement de valeur") fibaro:abort(); end ------------------------------------------------------------------------------ -- Table avec la liste des modules ------------------------------------------------------------------------------ local Table = { ["T_Id347"]={lux = 349, Lampes = {115}, lux_declenche = 30}, -- Hall Entre ["T_Id117"]={lux = 119, Lampes = {63, 65}, lux_declenche = 30}, --Terrasse Etage ["T_Id196"]={lux = 198, Lampes = {274}, lux_declenche = 30}, -- Garage ["T_Id127"]={lux = 129, Lampes = {276}, lux_declenche = 60} -- RUE } ------------------------------------------------------------------------------ -- Debut du programme ------------------------------------------------------------------------------ -- creation du nom de la table a chercher local Table_id = "T_Id"..ID -- On recupere le nombre de lampe Nbre_lampe = #Table[Table_id].Lampes -- Recuparation du nombre de lux local Lux = tonumber(fibaro:getValue(Table[Table_id].lux, "value")) --fibaro:debug("lux : "..Lux.." - Nombres de Lampe "..Nbre_lampe.." - Journee : "..fibaro:getGlobalValue("Jour_Nuit")) for i = 1,Nbre_lampe do local Lampe = tonumber(fibaro:getValue(Table[Table_id].Lampes[i], "value")) --fibaro:debug("lampe = "..Lampe.." Detection = "..detection.." Lux = "..Lux) if detection == 1 and Lux <= Table[Table_id].lux_declenche and Lampe == 0 then fibaro:call(Table[Table_id].Lampes[i], "turnOn") --fibaro:debug("Lumiere allumer "..i) elseif detection == 0 and Lampe >= 1 then fibaro:call(Table[Table_id].Lampes[i], "turnOff") --fibaro:debug("Lumiere Eteinte "..i) end end
Messages recommandés