Aller au contenu

Messages recommandés

Posté(e)

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
 
 
Posté(e)

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

Posté(e)

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

Posté(e)

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
Posté(e)

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
Posté(e)

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

Posté(e)

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 ?

Posté(e)

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

Posté(e)

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

Posté(e)

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 ?

Posté(e)

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

Posté(e)

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)
Posté(e)

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 

Posté(e)

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

Posté(e)


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)

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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 !

Posté(e)

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

×
×
  • Créer...