maconly34 Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 Salut les Masters truc bête, je déclare une variable dans le panneau de variables globales (fermevolet à 1) voilà ma scène de test : --[[ %% properties %% globals --]] fibaro:debug(fermevolet) voilà le débug : [DEBUG] 14:48:59: nil pourquoi Debug me retourne une valeur nulle ? P.S. j'ai bien étudié le tuto sur variables locales ou globales. MERCI
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 lol il faut faire un local fermevolet = fibaro:getGlobalValue( "fermevolet" ) Stp mets ton code dans la fenêtre c'est plus simple a lire il faut juste cliquer sur <>
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 Pour les variables elles sont local ou global au niveau de l'instance par contre les variables du panneau dites globales ce qui n'est pas le juste terme a mon sens sont des variables typics a fibaro, pour les utiliser il faut faire un get ou un set
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Salut mprinfo ;-) Comme je savais que tu allais regarder peut-être depuis Tapatalk, j'ai fais exprès de le mettre en txt simple, pour que tu puisses le lire ;-) Voilàle vrai script non modifié. Je n'ai pas utilisé de var local car elle ne serait visible que dans le bloc if-end, et comme elle doit me servir de flip/flop, il faut qu'elle soit visible dans tous les blocs. De plus je ne peux pas la déclarer en début de script car elle se réinitialiserai àchaque fois --[[ %% properties 49 value 45 value %% globals --]] local TempSalon = fibaro:getValue(49, "value") local TempVeranda = fibaro:getValue(45, "value") if ( TempVeranda > TempSalon and fermerVolet == 0 ) then fermerVolet = 1 fibaro:call(39, "turnOn") fibaro:sleep(3*1000) fibaro:call(39, "turnOff") end if ( TempSalon > TempVeranda and fermerVolet == 1 ) then fermerVolet = 0 fibaro:call(39, "turnOn") fibaro:sleep(1*1000) fibaro:call(39, "turnOff") end fibaro:debug("Temp Salon = " .. TempSalon) fibaro:debug("Temp Veranda = " .. TempVeranda) fibaro:debug(fermerVolet) Je vais faire des test avec les Fibaro Globales (Set et Get) MERCI 1
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 voila 2 fonctions que j'utilise pour mettre a jour le VG fibaro donc disponible de partout scène et VD -- ----------------------------------------------------------------- -- Vérification Variable Globale et création si besoin -- -- ----------------------------------------------------------------- function VerifVG(nom, valeur, choix) if (fibaro:getGlobalValue(nom) == nil) then local enum = 0 if (type(choix) ~= "nil") then enum = 1 end api.post("/globalVariables", {name=nom, isEnum=enum}) if enum == 1 then local variable = {} variable.value = tostring(valeur) variable.isEnum = false if (type(choix) ~= "nil") then variable.isEnum = true variable.enumValues = choix end api.put("/globalVariables/" .. nom, variable) end end end ---------------------------------------------------------------------- -- Mise a jour d'une variable global -- ---------------------------------------------------------------------- function UpdateVG(NomVG, Valeurs) if (fibaro:getGlobalValue(NomVG) == nil) then fibaro:debug("il faut cree la variable "..NomVG) EnvoiPush(string.format("La variable Globale %s n'existe pas ou a ete supprimer", NomVG)) fibaro:abort() -- fin du programme end fibaro:debug("Mise a jour de la Variable Globale : "..NomVG.." = "..Valeurs) fibaro:setGlobal(NomVG, Valeurs); end
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 moi je ferai un truc comme cela si tu n'as pas plus de chose a mettre local TempSalon = fibaro:getValue(49, "value") local TempVeranda = fibaro:getValue(45, "value") local fermerVolet = 0 if (TempVeranda > TempSalon and fermerVolet == 0) then fermerVolet = 1 fibaro:call(39, "turnOn") fibaro:sleep(3*1000) fibaro:call(39, "turnOff") elseif (TempSalon > TempVeranda and fermerVolet == 1) then fermerVolet = 0 fibaro:call(39, "turnOn") fibaro:sleep(1*1000) fibaro:call(39, "turnOff") end fibaro:debug("Temp Salon = " .. TempSalon) fibaro:debug("Temp Veranda = " .. TempVeranda) fibaro:debug(fermerVolet) je ne vois pas ou est le soucis de mettre fermerVolet au début du code car si la condition n'est pas remplit il n'y aura pas de mise a jour
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Super je vais décortiquer ces fonctions, qui déjà m'apporte beaucoup dans l'apprentissage du code LUA P.S. où déclares tu ces fonctions. y'a-t-il un emplacement spécifique de façon à pouvoir les utiliser dans toutes les scènes, sans avoir à les déclarer à chaque fois ?
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 Regarde le tuto jours nuit j'en utilise pas mal Il faut mettre au debut du scripts Envoyé de mon SM-G900F
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 Je te complique un peu la chose mais tu veras c'est super utile après on copie coller dans les scripts et on gagne du temp Envoyé de mon SM-G900F
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 moi je ferai un truc comme cela si tu n'as pas plus de chose a mettre local TempSalon = fibaro:getValue(49, "value") local TempVeranda = fibaro:getValue(45, "value") local fermerVolet = 0 if (TempVeranda > TempSalon and fermerVolet == 0) then fermerVolet = 1 fibaro:call(39, "turnOn") fibaro:sleep(3*1000) fibaro:call(39, "turnOff") elseif (TempSalon > TempVeranda and fermerVolet == 1) then fermerVolet = 0 fibaro:call(39, "turnOn") fibaro:sleep(1*1000) fibaro:call(39, "turnOff") end fibaro:debug("Temp Salon = " .. TempSalon) fibaro:debug("Temp Veranda = " .. TempVeranda) fibaro:debug(fermerVolet) je ne vois pas ou est le soucis de mettre fermerVolet au début du code car si la condition n'est pas remplit il n'y aura pas de mise a jour Bien si on fait plusieurs tour de programme avec tempVeranda > tempSalon on a : fermeVolet = 0 donc les conditions du 1er if sont remplies alors fermeVolet = 1 Donc tant que tempVeranda > tempSalon on effectuera les actions du 1er if Alors que je veux qu'elles ne se fassent qu'une seules fois Voilà pourquoi pas de déclaration en début de code. Mais c'est de ma faute je ne t'ai pas expliqué le rôle de ce script : il doit me prévenir quand il fait plus chaud dehors que dedans (un coup de sirène pendant x secondes) alors je ferme les volets SUD puis Stop jusqu'à ce la température extérieure soit plus fraiche qu'à l'intérieure re-coup de sirène plus ouverture des volets SUD et Stop jusqu'au prochain cycle
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 le programme ne fera qu'un tour puis ce terminera. il sera lancé de nouveau lors d'un changement de température l'id de ton volet c'est combien ?
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Le prog tourne toutes les 2 minutes, puisque mon capteur de température rafraîchi les valeurs toutes les 2 minutes (déjà testé), donc déclenchement du script Volets SUD : id 8 et 113
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 pourquoi en début de script tu ne récupères pas la valeur du volet ? local fermerVolet = tonumber(fibaro:getValue(id, "value")) pour les volets je n'utilise jamais close et open mais toujours les valeurs qui vont de 0 à99 local valeurs = 99 fibaro:call(id, "setValue", valeurs)
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Tout simplement parce-que je peut être dans un cas ou j'ai besoin d'ouvrir le volet en manuel, alors le prog me le refermerai aussitôt. Pour le moment ce scripts me prévient seulement de l'inversion des températures (coup de sirène pendant une seconde) mais pas encore donné l'ordre de fermer les volets SUD CQFD
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 il faut que tu récuperes la valeur des volets pour savoir si ils sont fermer ou ouvert ensuite tu fais le test de température avec ces 2 résultats tu exécutes ou pas les actions siréne et actionnement des volets
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 local TempSalon = fibaro:getValue(49, "value") local TempVeranda = fibaro:getValue(45, "value") local fermerVolet = fibaro:getGlobalValue("fermerVolet") if TempVeranda > TempSalon and fermerVolet == 0 then fibaro:setGlobal("fermerVolet", 1) fibaro:call(39, "turnOn") fibaro:sleep(3*1000) fibaro:call(39, "turnOff") elseif TempSalon > TempVeranda and fermerVolet == 1 then fibaro:setGlobal("fermerVolet", 0) fibaro:call(39, "turnOn") fibaro:sleep(1*1000) fibaro:call(39, "turnOff") end fibaro:debug("Temp Salon = " .. TempSalon) fibaro:debug("Temp Veranda = " .. TempVeranda) fibaro:debug(fermerVolet)
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 voilà mon débug (on voit le cycle de 2 minutes) [DEBUG] 19:40:51: Temp Salon = 27.2 [DEBUG] 19:40:51: Temp Veranda = 30 [DEBUG] 19:40:51: 1 [DEBUG] 19:42:51: Temp Salon = 27.1 [DEBUG] 19:42:51: Temp Veranda = 30 [DEBUG] 19:42:51: 1 [DEBUG] 19:44:51: Temp Salon = 27.2 [DEBUG] 19:44:51: Temp Veranda = 30 [DEBUG] 19:44:51: 1
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 je t'ai mis le code pour mettre àjour la variables globale fermerVolet
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Trop cool, ENCORE UN GRAND MERCI AU MASTERS DE CONSACRER DU TEMPS POUR LES NEWBIES
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 De rien cela fais toujours plaisir d'aider les autres si je commence a me débrouiller en lua c'est grâce a ce forum Envoyé de mon SM-G900F
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Bon encore petit souci, on dirait que le test avec la var globale ne fonctionne pas j'ai inversé le test du elseIf des tempértures pour ne pas attendre (Test n°2) et je n'est pas d'action exécutée --[[ %% properties 49 value 45 value %% globals --]] local TempSalon = fibaro:getValue(49, "value") local TempVeranda = fibaro:getValue(45, "value") local fermerVolet = fibaro:getGlobalValue("fermerVolet") local actionTEST = "éteint" if TempVeranda > TempSalon and fermerVolet == 0 then fibaro:setGlobal("fermerVolet", 1) fibaro:call(39, "turnOn") fibaro:sleep(3*1000) fibaro:call(39, "turnOff") elseif TempSalon < TempVeranda and fermerVolet == 1 then fibaro:setGlobal("fermerVolet", 0) fibaro:call(39, "turnOn") fibaro:sleep(10*1000) fibaro:call(39, "turnOff") actionTEST = "allumé" end fibaro:debug("Temp Salon = " .. TempSalon) fibaro:debug("Temp Veranda = " .. TempVeranda) fibaro:debug(fermerVolet) fibaro:debug("Action TEST = " .. actionTEST) [DEBUG] 20:39:52: Temp Salon = 27.2 [DEBUG] 20:39:52: Temp Veranda = 27.8 [DEBUG] 20:39:52: 1 [DEBUG] 20:39:52: Action TEST = éteint
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 tu as la valeur du début du code ce qui est normal met juste avant les debugs fermerVolet = fibaro:getGlobalValue("fermerVolet")
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Effectivement cela sera plus précis, bien que si on passait par le test elsif on modifierait la valeur de la global à 0 Test effectué, mais toujours pas OK bizarrre, je ne vois absolument pas d'erreur !
mprinfo Posté(e) le 21 juin 2015 Signaler Posté(e) le 21 juin 2015 Essaie de mettre tonumber Ton erreur viens sûrement de la Envoyé de mon SM-G900F
maconly34 Posté(e) le 21 juin 2015 Auteur Signaler Posté(e) le 21 juin 2015 Effectivement c'était ça ! Visuellement l'état des variables était bon, mais pas le type. Dommage de ne pas avoir d'erreur "type mismatch" comme en C, C++ etc. Ne peut ton pas définir les variables comme en C++ avec un type (string, num, bin...)
Messages recommandés