Domollier Posté(e) le 27 janvier 2018 Signaler Posté(e) le 27 janvier 2018 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
Barelle Posté(e) le 27 janvier 2018 Signaler Posté(e) le 27 janvier 2018 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
PdB Posté(e) le 28 janvier 2018 Signaler Posté(e) le 28 janvier 2018 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'))
Domollier Posté(e) le 28 janvier 2018 Auteur Signaler Posté(e) le 28 janvier 2018 (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é le 28 janvier 2018 par Domollier
PdB Posté(e) le 30 janvier 2018 Signaler Posté(e) le 30 janvier 2018 (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é le 30 janvier 2018 par PdB
Steven Posté(e) le 30 janvier 2018 Signaler Posté(e) le 30 janvier 2018 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 :
Domollier Posté(e) le 31 janvier 2018 Auteur Signaler Posté(e) le 31 janvier 2018 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
Steven Posté(e) le 7 février 2018 Signaler Posté(e) le 7 février 2018 Visual Foxpro ... lol ... j'ai développé mon projet de diplôme avec cela ... il y a ... heuuuu ... fort longtemps. 1
Domollier Posté(e) le 9 février 2018 Auteur Signaler Posté(e) le 9 février 2018 (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é le 9 février 2018 par Domollier
Steven Posté(e) le 13 février 2018 Signaler Posté(e) le 13 février 2018 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 finiIl 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. 1
Domollier Posté(e) le 1 mars 2018 Auteur Signaler Posté(e) le 1 mars 2018 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
Messages recommandés