Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

après un mois à  vous lire et a comprendre plus ou moins ce que vous arrivez à  faire avec vos HC2, je me lance enfin dans mes premières vrai ligne de code.

 

Et là , j'ai direct un problème.

 

Je ne me lance pourtant pas dans des chose compliqué. Je voudrais faire allumer une lampe quand mon détecteur capte une présence, et si il fait presque nuit, ou nuit.

 

j'ai écris ça, mais ça ne fonctionne pas.

--[[
%% properties
40 value
%% globals
--]]

local a  = fibaro:getValue(40, "value")
local dt = os.date("%H:%M")

fibaro:debug("début du script à  : "..dt) 
fibaro:debug("état du capteur : "..a)

if ( fibaro:getValue(40, "value") == "1" and tonumber(fibaro:getValue(43, "value")) < 9)
    then
    fibaro:call(34, "turnOn")
    fibaro:debug("J\'allume la lumière à  : "..dt)
    fibaro:sleep(2*60*1000) 	-- attendre 2 minutes
    fibaro:call(34, "turnOff")
    dt = os.date("%H:%M")
    fibaro:debug("Lumière éteinte à  : "..dt)
    else
end
  

40, ID du capteur de mouvement

43, ID du capteur de luminosité

Posté(e)

non, je n'ai pas d'erreur dans le module de debug,

c'est ma condition :

 tonumber(fibaro:getValue(43, "value")) < 9

qui n'est pas remplie.

quand je l'enlève, ma lampe s'allume dès que mon détecteur de mouvement capte qqc.

 

Pour se qui est de l'ID 43 dans les triggers Properties, je pensais qu'il fallait mettre là  les conditions de déclenchement de la scène.

Posté(e)

Je viens de tester.

Et bien, ça fonctionne, mais j'avoue qu'il faut que je revois quelques principe de codage de notre box préféré, car pour moi, les triggers servent à  déclencher la scène.

Je n'arrive pas à  saisir pourquoi il faut que je rajoute l'ID 43 (détecteur de luminosité)  dans les triggers Properties

Posté(e)

Tant mieux si tout fonctionne.

 

C'est logique, car dans ta scène tu demande 2 conditions avant l'action.

Comme tu as 2 détecteurs, il faut les mettre en "trigger".

 

Si tu avais choisi eu 1 détecteur et 1 variable en déclencheur, il aurait fallu mettre l'id du détecteur dans "properties" et le nom de la variable dans "globals"

Posté(e)

OK, mais mon déclencheur, ce n'est que capteur de mouvement (ID 40)

 

Donc si je veux faire une scène où j'ai l'état de 2 ou 3 capteurs à  tester pour déclencher une action, je devrai mettre les ID de tout mes capteurs dans les triggers ?

Posté(e)

Faux, tes déclencheurs sont id40 ET id43 dans ton cas.

 

Si tu ne mets que id40, y'a que le capteur de mouvement.

Si tu ne mets que id43, y'a que le capteur de luminosité.

 

Et, oui, si tu as plusieurs capteurs en condition, ca sera X id à  saisir dans "properties"

 

Pour info, voici le début d'une de mes scènes, en conditions, j'ai mis mes détecteurs souhaités ( et précisé qu'il soient armés );

--[[
%% properties
133 value
25 value
232 value
103 value
229 value
132 value
28 value
31 value
133 armed
25 armed
26 armed
103 armed
229 armed
28 armed
31 armed
131 armed
%% globals
VAR
--]]

if (fibaro:countScenes() > 1) then fibaro:abort() end;
...
Posté(e)

Je vais me permettre de contre-dire.

Dans l'entête du script il faut mettre "les déclencheurs du script". Dans le cas de DeuxG, uniquement l'ID 40 car c'est lorsque son détecteur va changer de valeur que le script doit s’exécuter. En ajoutant l'ID 43, le script va s'exécuter chaque fois que la luminosité va changer ce qui n'a aucun sens.

 

Il devait juste y avoir un petit bug dans ton code. Je l'ai repris et voici un script qui fonctionne parfaitement. Je l'ai testé dans la même configuration mais avec mes IDs.

--[[
%% properties
40 value
%% globals
--]]
 
local detection  = fibaro:getValue(40, "value")
local lux = fibaro:getValue(43, "value")
local dt = os.date("%H:%M")
 
fibaro:debug("début du script à  : ".. os.date("%H:%M")) 
fibaro:debug("état du capteur : ".. detection)
fibaro:debug("luminosité : ".. lux)
 
if ( tonumber(detection) == 1 and tonumber(lux) < 9 ) then
    fibaro:call(34, "turnOn")
    fibaro:debug("J\'allume la lumière à  : "..os.date("%H:%M"))
    fibaro:sleep(30*1000) 	-- attendre 2 minutes
    fibaro:call(34, "turnOff")
    fibaro:debug("Lumière éteinte à  : "..os.date("%H:%M"))
end
  • Upvote 1
Posté(e)

@moicphil

 

Dans ton exemple de scénario, 

 

id value

id armed

 

ce n'est pas une condition, c'est que le scénario va s'exécuter quand ton ID va changer de valeur (porte ouverte ou fermée) mais aussi quand l'ID va être armé ou désarmé.

Posté(e)

Tu me rassures Steven.

Je sais bien qu'il y a très longtemps que je n'avais pas couché une ligne de code (en C à  l'époque), mais bon....

Après un mois passé à  vous lire, je pensais bien avoir saisi les quelques bases des scripts LUA sur HC2 ; bien sur le chemin et encore long avant que je réalise tout ce que j'ai en tête.

 

Merci pour le script, je vais le tester aujourd'hui.

Posté(e)

Bonjour.

 

Je sens venir un débat passionnant !  :D

 

Steven, tu ne me contredit pas quand tu dis "il faut mettre les déclencheurs du script", c'est ce que j'ai dis.

 

Et pour moi, les déclencheurs du scripts sont bien id40 et id43.

Et le script ne va pas s’exécuter que seulement quand id43 sera valide, il faudra aussi que id40 soit valide.

 

Tu as surement raison, je ne suis pas codeur, mais j'ai toujours réalisé mes scènes comme ceci et ça a toujours fonctionné.

 

Peut tu me dire ou était sa "coquille" dans le code du départ ?

 

 

Dans ton exemple de scénario, 

 

id value

id armed

 

ce n'est pas une condition, c'est que le scénario va s'exécuter quand ton ID va changer de valeur (porte ouverte ou fermée) mais aussi quand l'ID va être armé ou désarmé.

 

On est d'accord oui et non, car oui " le scénario va s'exécuter quand ton ID va changer de valeur (porte ouverte ou fermée) mais aussi quand l'ID va être armé ou désarmé"

Mais non quand tu dis "ce n'est pas une condition"

Posté(e)

Tu es donc entrain de dire que pour que GEA fonctionne, tu as du rajouter tout tes ID dans l'entête ? Et ceci chez tout le monde ;)

 

Ce n'est pas parce que tu vérifies l'état d'un module que ce dernier doit être dans l'entête, cela n'a rien à  voir. Les ID déclaré dans l'entête sont les ID qui vont déclenché le scénario.

 

Dans le cas de DeuxG il ne veux pas que le scénario ce lance quand la luminosité change, l'ID 43 est donc inutile. Il veux que le scénario se lance quand le déclencheur change. 

 

Un "if" mal fait avec trop de déclencheurs dans l'entête provoque facilement des soucis. Donc pour éviter ce genre de problème, les gens ajoute un code bizarre et inutile dans 99% des cas :

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

Qui signifie ... si je me suis planté dans mes déclencheurs, fait en sorte que la scène ne se lance pas 2 fois en même temps :)

 

Fait des tests et tu verras :)

  • Upvote 1
Posté(e)

Promis, oui je vais faire des tests...

Je suis sur que si je fais la scène de DeuxG en mode bloc, tu verras que les 2 détecteurs seront cochés en trigger dans l'interface.

Non?

Et pis tu dis qu'il ne veut pas que la scène se lance en fonction de la luminosité... Moi je comprends que oui justement: si capteur luminosité < 9...

Envoyé de mon C6603 en utilisant Tapatalk

Posté(e)

Pour info, quand j'ai fait le test en mettant l'ID 43 en déclencheur, ma scène s'est lancé deux fois en même temps, j'ai reçu deux notifications.

 

Je fais le test Ce soir avec le code de Steven

Posté(e)

Alors...

 

j'ai créer à  peu prés la même scène que DeuxG en mode bloc avec un détecteur de présence et un capteur de luminosité :

 

C'est bien ce que je disais, on voit bien nos 2 détecteurs en "trigger" :

 

gallery_2_5_27031.jpg

 

Alumage de la scène en Lua...

 

Pareil, on retrouve bien nos 2 id dans "properties"  :

 

gallery_2_5_30347.jpg

 

 

 

Verdict mon colonel ?

Posté(e)

Je confirme, le mode bloc est un générateur ... pourri :)

 

Voici de la lecture d'un précédent post, tu verras que le mode bloc "coche" tout et n'importe quoi et que cela pose de vrai problème.

http://www.domotique-fibaro.fr/index.php/topic/899-capteur-de-position-zg8101-et-module-fgs-221/?p=10231

 

Exemple stupide de ce qu'il ne faut pas faire :

--[[
%% properties
91 value
%% globals
--]]

local porte = 91
local lumiere = 65
if (tonumber(fibaro:getValue(porte, "value")) > 0)  and  (tonumber(fibaro:getValue(lumiere, "value")) > -1) then
	if (tonumber(fibaro:getValue(lumiere, "value")) > 0) then
		fibaro:call(lumiere, "turnOff");
	else
		fibaro:call(lumiere, "turnOn");
	end
end

Ce code n'est pas méchant, si tu ouvre la porte (91) la lumière (65) s'allume. Par contre, si tu rajoutes l'ID 65 dans l'entête, c'est discothèque assurée tant que la porte est ouverte :)

  • Upvote 1
Posté(e)

En effet...j'en prend bonne note !

Même si je n'utilise plus les blocs, au départ, comme beaucoup je pense, je créais des scènes en bloc, puis je la passais en Lua , ça me permettais de comprendre plus facilement la structure du code.

 

C'est quand même navrant mais aussi étonnant, car bon nombres de mes scènes tournent actuellement avec plusieurs id en trigger...

 

En tout cas, merci pour les détails.

 

Steven 1 / Fibaro 0

Posté(e)

Tes scènes fonctionnent bien car les "IF" sont bien fait et complet ainsi, même si tu passes 2 fois dans ta scène, le "IF" va stopper le deuxième passage.

 

En règle général, le mode bloc se débrouille très bien par contre en LUA l'erreur est vite arrivée et peut être vicieuse à  comprendre.

Posté(e)

Moi bizarrement, je n'y comprend rien au mode bloc.

Le LUA me parle, même si j'ai encore d'énorme lacune àcombler.

×
×
  • Créer...