Aller au contenu
Lionel57

Allumage/extinction Automatique Des Lumières

Recommended Posts

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.

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour le partage.

 

Peut tu éditer ton message et utiliser les balises pour le code ?  <>

Partager ce message


Lien à poster
Partager sur d’autres sites

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é...

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

 

Je ne comprends pas d'où sort la fonction setimeout. C'est du javascript pas du LUA ?

Partager ce message


Lien à poster
Partager sur d’autres sites

@bencol, non setimeout c'est bien ici du LUA ;) mais uniquement disponible avec les nouvelles libs de la V4 :15: , 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)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par moicphil
Bonjour, merci de ne pas citer un message situé juste au dessus.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :P )

 

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.

 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;) 

Partager ce message


Lien à poster
Partager sur d’autres sites

?? 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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

:) 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 :)

Partager ce message


Lien à poster
Partager sur d’autres sites

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,

Partager ce message


Lien à poster
Partager sur d’autres sites

Je suis aussi preneur du VD comme le dirait q.philippe :-), si possible avec les conseils de Krikroff. :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

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  :13:

Partager ce message


Lien à poster
Partager sur d’autres sites

@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

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

A tester mais tu as fait une faute d'orthographe :-)

'getGloabalValue'

Pas vu que Peter avait repondu sur la faute aussi hihi

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour votre aide je regarde sa demain àtête reposée

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×