Aller au contenu

Variable Globale Du Panneau Var Non Reconnue Dans Scène


maconly34

Messages recommandés

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
 
 
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)
Lien vers le commentaire
Partager sur d’autres sites

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 

Lien vers le commentaire
Partager sur d’autres sites


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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...