Aller au contenu

Debut L U A difficile


Messages recommandés

Posté(e)

Bonjour,

Impossible de recuperer la date de modification d'une variable ...

Ou est mon erreur ???  Je souhaite recuperer le temps depuis la derniere modification d'une variable de presence
Ceci pour eteindre une lumiere si on est passé de 1 à 0 depuis plus de 30mn sur la variable presence ...

 

Je precise que la variable PresenceCuisine est global et inscrite dans le panneau variable

 

Voici le code

-- local test=0
-- local DerniereModif=0

-- PresenceCuisine=fibaro:getValue(22, 'value')

-- (j'ai essayé  test=fibaro:get(22, 'timeStamp') >> ERREUR)

-- puis test=fibaro:getGlobalModificationTime("PresenceCuisine")
-- DerniereModif= os.time() - fibaro:getGlobalModificationTime("PresenceCuisine")

-- fibaro:debug("PresenceCuisine:"..PresenceCuisine)
-- fibaro:debug("test:"..test)

-- fibaro:sleep("2000")

 

Quand je lance un debug, la variable test donne un grand nombre qui ne varie pas alors que Presencecuisine passe bien de 0 a 1
puis vis et versa  


Comment faire pour recuperer cette variable de temps

Merci

Posté(e)

Je te suggère d’essayer le code suivant que je n'ai pas testé.

 

local capteurId = 22;	-- capteur de mouvement
local PresenceCuisine = fibaro:getValue(capteurId, "value");
local DerniereModif = os.time() - fibaro:getModificationTime(capteurId, "value"); -- en secondes
fibaro:debug("PresenceCuisine="..PresenceCuisine..", DerniereModif="..DerniereModif);

if (DerniereModif >= 30 * 60) then -- 30 minutes
	-- éteindre la lumière
end

 

Posté(e)

En fait tu confonds variable locale (créée dans une scène par local xx = yy), et variable globale créée dans le "panneau variables".

La fonction fibaro:getGlobalModificationTime("xx") n'est valable que pour une variable globale

 

Ta valeur DerniereModif devrait être:

local DerniereModif = os.time() - fibaro:getModificationTime(22,'value')) 

Posté(e) (modifié)

Merci beaucoup ;-) Ca marche enfin !! Sincerement j'avais passé du temps !!! mais le but etait aussi de comprenfdre le LUA!  j'aimerais bien comprendre mieux

si je comprends bien et malgré que ma variable locale soit declarée au debut par

[

-- local DerniereModif=0

-- PresenceCuisine=fibaro:getValue(22, 'value')

]

 

Il faut remettre "local" sur chaque ligne ou  j'utilise cette variable ???

 

actuellement j'ai mis

local PresenceCuisine=0
local DerniereModif=0

 

local PresenceCuisine=fibaro:getValue(22, 'value')
local DerniereModif = os.time() - fibaro:getModificationTime(22,'value')  

 

ca marche mais mes 2 premieres lignes de declaration ne servent à rien ??

 

je precise que j'ai toujours codé avec des langages interpretés ... qui attendent sagement pour executer des instructions dans l'ordre ... ce que je peut reproduire avec mon cerveau !!

 

je comprends bien quavec des multicoeur multithread si on ne distingue pas les variables globales il y aurait des conflits !!

mais je ne comprends pas bien la syntaxe ..

 

de la même façon si j'ai cree dans le tableau de variable une variable ilyaquelquundanslacuisine

et que je mets dans mon code ici

if DerniereModif < 3000 then

ilyaquelquundanslacuisine=1

end

 

ma variable n'est pas modifiée dans le tableau  je suis obligé de passer par setglobal ...

dans ce cas je ne comprends pas les exemples lus partout avec une variable affectée sans le "local" en debut de ligne ??

 

une hypothese serait

* on recupere une variable globale

* on la modifie en local on l'utilise mais ca ne change rien a sa valeur globale sauf si on remet un setglobal à la fin ??

 

Bref ce sont quelques generalités qui me manque les liens trouves sont toujours des exemples...

 

 

 

 

Modifié par Domollier
Posté(e) (modifié)

Une variable locale est déclarée ans une scène ou un VD par:

local variable = valeur

 

Une fois déclarée, tu n'as pas besoin d'utiliser à nouveau la fonction "local" dans la scène pour modifier la variable. 

 

Comme son nom l'indique elle est locale, c'est-à-dire propre à la scène ou le VD en question. 

Tu ne pourras pas récupérer sa valeur ni la modifier dans une autre scene ou un autre VD.

 

L'intérêt des variables globales est que tu peux récupérer leurs valeurs d'une scène à l'autre.

Il faut au préalable l'avoir déclaré dans le panneau variables. Tu es obligé de passer par les fonctions getGlobal et setGlobal pour les manipuler:

Par ex si tu as une variable globale varglob dans le panneaux de variables, sa valeur ne sera pas modifiée par varglob = valeur

il faudra utiliser

fibaro:setGlobal('varglob',"valeur') 

pour modifier la valeur de la variable

 

pour lire sa valeur c'est:
 

fibaro:getGlobal('varglob')

 

Modifié par PdB
Posté(e)

Attention le mot clé "local" revient à dire en Français "crée moi une variable" (je met de côté l'aspect sur la portée de telle variable et tout le charabia qui fait qu'un développeur est une personne qui à déjà de la peine à se comprendre lui-même) 

 

Donc ceci n'a aucun sens :

local PresenceCuisine=0
local PresenceCuisine=fibaro:getValue(22, 'value')

car tu demandes au système de te créer 2 fois la même variable.

 

Si, dans les premiers temps, tu ne veux pas te prendre la tête, oubli le mot "local", il ne te servira a rien. Tu peux très bien faire ainsi :

PresenceCuisine=fibaro:getValue(22, 'value')

LUA va comprendre ce que tu veux faire et va crée la variable pour toi avant de lui affecter la valeur souhaitée.

 

Si tu souhaite plus d'info, il y a un vieux post, mais toujours d'actualité, ici :

 

Posté(e)

merci ;-) c'est donc comme avec mon langage preféré (Visual foxpro ... je sais ca a 20 ans !!)

1 je declare  2 je reprends sans declarer

La seule difference c'est que la box fait plein de truc en même temps quand mon langage faisait les etapes demandees une par une !

Je crois que j'ai compris

Posté(e)

Visual Foxpro ... lol ... j'ai développé mon projet de diplôme avec cela ... il y a ... heuuuu ... fort longtemps.

  • Like 1
Posté(e) (modifié)

... J'ai fait un gros programme ... il y a 20 ans .. mais ce n'est pas mon metier ... Ceci dit  ce programme me genere toujours pas mal de royalties!! les utilisateurs me disent quils le garderont jusqu'a la retraite même si je ne fait plus rien et ils reglent leur licence tous les ans sans même un appel de cotisation !!  Quand je fais le bilan des 20 ans c'est vraiment un bon plan ... Dommage quils vieillissent et partent un par un en retraite!

 

Mais revenons à nos moutons .... je suis loin d'etre au point en LUA  ;-) pour l'instant J'ai un peu l'impression de nager.

Merci @steven pour le lien assez clair sur les variables locales qui montre un usage un peu different de ce que je connaissais Les exemple que j'avais trouvé remettaient local  a chaque fois ce qui est un usage tres particulier.

 

Je débute avec la HC2 ... pour l'instant je suis dans la première phase en train de creer des peripheriques virtuels pour recuperer mes modules enocean en utilisant ma zibase en passerelle. Ca semble bien fonctionner.

Pour le zwave J'ai desinstallé les modules sur la zibase, puis je les ai réinstallés sur la HC2.

 

Malgré pas mal de temps passé sur le forum j'ai  l'impression de ne pas avoir vraiment compris le fonctionnement général de l'interface ...
Ma petite experience utilisait des langages interprétés  s'executant ligne apres ligne dans l'ordre !
et là je suis un peu perdu puisque j'ai l'impression que l'interface fait plein de choses en même temps ce qui est logique avec les machines multi coeurs..

Je vais essayer de résumé ce que je crois avoir compris et vous remercie de me reprendre si je dis des âneries...

 

Exemple

Module virtuel avec 1 etiquette 2 boutons ON et OFF
Fenetre 1  code LUA dans le ON du premier bouton
Ce code ne sera executé qu'une seule fois  lorsqu'on clic sur le bouton ou lorsque qu'on utilise la commande call(idmodule,'pressButton","1")
Si je mets un sleep dans ce code les autres modules continuent à tourner pendant le sleep
et la suite du code reprend après le sleep et ne sera executée qu'apres le temps de pause demandé.
Ensuite sauf nouvelle action le code n'est pas executé à nouveau.

 

Fenetre 2  code LUA dans le OFF du premier bouton
idem fenetre 1

 

Fenetre 3  boucle principale
Ce code tourne en permanence Il reprend au debut lorsqu'il a fini
Il est donc conseillé de mettre un sleep pour que la machine puisse attribuer correctement ses ressources aux autres modules.
J'imagine que ces codes "boucle" (1 par module virtuel) sont reparties par le systeme sur les coeurs mutiples du processeur ?

Il est conseillé de mettre au debut de cette boucle ce bloc:
[[
%% globals
%% properties
]]

Si je mets
[[
%% globals
 variableglobale1
%% properties
]]
et que j'inscris ma variable "variableglobale1" dans le tableau des variables globales Toute modification ailleurs dans le systeme declenche l'execution du code?
Mais ca sert a quoi puisque ce code tourne de toute façon en permanence (hors sleep)
C'est incoherent .. J'ai du  rater quelque chose !!

 

Dans les scenes les commandes du style
fibaro:call(101,'turnOff') ne fonctionnent pas pour les modules virtuels mais fonctionne pour les modules zwave
il faut utiliser (pressButton,1) par exemple

Enfin j'ai des comportements inexpliqués par exemple 2 scenes "EteintToutSalon" et "AllumeToutSalon"
si je lance la première il semble que la seconde s'execute ensuite ... et les lumieres se rallument!

J'ai terminé le code de ces deux scene par fibaro:Abort()  sinon j'ai l'impression aussi que les scenes tournent en boucle

Bref je vous remercie de m'éclairer .. je vois bien que je ne comprends pas ...

 

 

 

 

Modifié par Domollier
Posté(e)

Tu as quasiment tout compris hormis un point important.

 

Fenetre 3  boucle principale. (appelée "main loop")

"Ce code tourne en permanence Il reprend au debut lorsqu'il a fini
Il est donc conseillé de mettre un sleep pour que la machine puisse attribuer correctement ses ressources aux autres modules."

La réponse est non, ce code ne tourne pas en permanence mais toutes les 3 secondes. Le sleep est donc à proscrire vu qu'il est déjà fait.

 

Pour ceci :

--[[
%% globals
 variableglobale1
%% properties
]]--

Ce genre de code n'est valable QUE dans les scénarios. Si tu met cela dans le "main loop" d'un module virtuel cela ne fera rien du tout. Cela répond à ta question 

"Mais ca sert a quoi puisque ce code tourne de toute façon en permanence (hors sleep)
C'est incoherent .. J'ai du  rater quelque chose !!"

 

Pour les scénarios qui tournent en boucle ou l'un qui déclenche l'autre sans que cela semble cohérent. Le problème vient toujours de l'entête (le code mentionné ci-dessus). L'entête décrit les déclencheurs du scénario.

 

Si je met dans l'entête d'un de mes scénarios ceci :

--[[
%% globals
%% properties
130 value
]]--

A chaque fois que le module (z-wave) 130 va changer de valeur, ce scénario sera exécuté (idem pour les variables globales). Dans l'entête ne doivent figurer QUE et UNIQUEMENT les événements qui vont déclencher le scénario.

 

Exemple de scénario à problème

--[[
%% globals
%% properties
130 value
]]--


if (fibaro:getValue(130, "value") == "0") then 
   fibaro:call(130, "turnOn")
else
   fibaro:call(130, "turnOff")
end

En gros, chaque fois que le module 130 change de valeur je relance ce scénario et ce scénario allume ou éteint le module 130 selon son état ... et voilà une jolie boucle sans fin qui va faire clignoter ton module 130 comme un arbre de Noël. 

 

Voilà, j'espère avoir répondu à ta/tes questions.

  • Like 1
  • 3 semaines après...
Posté(e)

Merci steven ... Je crois que je commence un peu a mieux comprendre la philosophe generale avec ces explications et a la lumiere de ces infos ca commence a marcher . en tout cas c'est deja beaucoup plus efficace que ma zibase  et puis le LUA c'est quand même beaucoup mieux pour des decisions un peu compliquées (ex je gere une recirculation d'eau chaude en boucle entre une chaudiere fioul et un gros ballon chauffé au soleil ceci en fonction des T° mini de la production solaire de la presence ou non d'hotes de la T° de chaque ballon .. avec la zibase javais plein de scenario intriqués qui ramaient beaucoup et en conclusion on attendait 3secondes pour tous les interrupteurs!)

Bon je souffre un peu avec la syntaxe mais ca s'ameliore  il faut que j'oublie les majuscules et les points de mon Foxpro ;-)  .AND. devient and  .. je progresse lentement 

×
×
  • Créer...