Aller au contenu

Question Lua


Messages recommandés

Posté(e)

Bonjour, 

 

J'ai écrit ce code Lua à  partir des bloc Fibaro

--[[
%% properties
%% globals
jour_nuit
iphoneAnne
iphoneSeb
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( fibaro:getGlobalValue("jour_nuit") == "jour" ))
then
    if(
 ( tonumber(fibaro:getGlobalValue("iphoneAnne")) == tonumber("1") )
or
 ( tonumber(fibaro:getGlobalValue("iphoneSeb")) == tonumber("1") )

)
  
  then
fibaro:call(63, "setArmed", "0");
    else
    fibaro:call(63, "setArmed", "1");
end
  else
  fibaro:call(63, "setArmed", "1");
  end
 
Et ca marche pas :(
 
Je veux que mon module ouverture de porte (Module ID 63) s'arme:
 
Le jour que si un des deux iphone est détecté sur le réseau et la nuit soit armé tout le temps....
 
Merci de votre aide
 
Sébastien
Posté(e)

Bonjour 

 

Merci d'éditer le message et d'utiliser les balises pour code : <>

 

De plus, faire attention à  l'endroit ou poster le sujet...pour info je l'ai déplacé de "mon installation" à  "support hc2"

Posté(e)

Non!  ;)

En fait, pour mieux voir le code, un fond noir sera ajouté quand tu auras inséré ton code, pour cela :

 

- éditer le message

-Cliquer sur les balises "code"

- inserer le code Lua

 

Voici une copie d'écran :

post-2-0-95195100-1411309692_thumb.jpg

Posté(e)

Peux tu essayer ça ? :

--[[
%% properties
%% globals
jour_nuit
--]]
 
local startSource = fibaro:getSourceTrigger();

local iphoneAnne = tonumber(fibaro:getGlobalValue("iphoneAnne"))
local iphoneSeb = tonumber(fibaro:getGlobalValue("iphoneSeb"))
local jour_nuit = fibaro:getGlobalValue("jour_nuit")


if jour_nuit == "jour" and ( iphoneAnne == tonumber("1") or iphoneSeb == tonumber("1") )
 then
  fibaro:call(63, "setArmed", "1")
   end


if jour_nuit == "nuit"
 then  
  fibaro:call(63, "setArmed", "1");
   end
Posté(e)

Ce que j'ai mis ne doit pas marcher...

 

Tes triggers sont l'un des 2 iphones donc il faut modifier l’entête, et j'ai oublié le "else"

--[[
%% properties
%% globals
iphoneAnne
iphoneSeb
--]]
 
local startSource = fibaro:getSourceTrigger();

local iphoneAnne = tonumber(fibaro:getGlobalValue("iphoneAnne"))
local iphoneSeb = tonumber(fibaro:getGlobalValue("iphoneSeb"))
local jour_nuit = fibaro:getGlobalValue("jour_nuit")


if jour_nuit == "jour" and ( iphoneAnne == tonumber("1") or iphoneSeb == tonumber("1") )
 then
  fibaro:call(63, "setArmed", "1")
   else
    fibaro:call(63, "setArmed", "0")
     end


if jour_nuit == "nuit"
 then  
  fibaro:call(63, "setArmed", "1");
   end
Posté(e)

Malheureusement ma porte ne s'est pas armé automatiquement à  la nuit.... 

 

De plus, je voudrais que le jour, si ma femme ou moi sommes à  la maison, la porte ne s'arme pas, mais si nous sommes pas à  la maison, que la porte s'arme. Et la nuit que nous y soyons ou pas, que la porte s'arme... C'est compliqué non?

 

Merci de votre aide.

 

Sébastien

Posté(e)

Dans ton 1er post tu dis :

 

Je veux que mon module ouverture de porte (Module ID 63) s'arme:

 
Le jour que si un des deux iphone est détecté sur le réseau 

Dans le dernier :

 

 

De plus, je voudrais que le jour, si ma femme ou moi sommes à  la maison, la porte ne s'arme pas,

 

C'est pas contradictoire non ?

 

Tu peux faire le point sur ce que tu veux exactement, on essayera de trouver quelquechose... 

;)

Posté(e)

@Sébastien

A mon avis, ton code (1er post) fonctionne très bien, ce qui ne doit pas fonctionner c'est ta manière de tester ton code :)

 

Si tu testes ton code en modifiant la valeur des variables globales depuis le Panneau des variables .. je te rassure de suite, cela ne va jamais fonctionner. En effet, quand tu modifies une variable depuis le Panneau de Variables les scénarios ne sont pas déclenchés :(

 

Aà¯eeeee, je suis entrain de penser à  quelque chose : Comment gères-tu la détection de tes téléphones ? Si tu utilises l'api ... c'est mort aussi pour la même raison, "un changement de variable via l'api ne déclenche pas les scénarios".

 

 

Sinon, je te propose de faire un scénario de test pour tester ton scénario (tordu, je sais mais avec les variables globales, c'est le plus sà»r) :

fibaro:setGlobal("jour_nuit", "nuit")
fibaro:setGlobal("iphoneAnne", "1")
fibaro:setGlobal("iphoneSeb", "1")

-- Mode nuit
fibaro:sleep(500)
if (tonumber(fibaro:getValue(63, "armed")) > 0) then 
	fibaro:debug("Mode nuit : porte armée : OK")
else
	fibaro:debug("Mode nuit : porte armée : ERRRROOORRRR")
end

-- Mode jour avec 2 personnes à  la maison
fibaro:setGlobal("jour_nuit", "jour")
fibaro:sleep(500)
if (tonumber(fibaro:getValue(63, "armed")) > 0) then 
	fibaro:debug("Mode jour : presence (2) : ERRROOOORRRR")
else
	fibaro:debug("Mode jour : presence (2) : OK")
end

-- Mode jour avec 1 personne à  la maison
fibaro:setGlobal("iphoneAnne", "0")
fibaro:sleep(500)
if (tonumber(fibaro:getValue(63, "armed")) > 0) then 
	fibaro:debug("Mode jour : presence (1) : ERRROOOORRRR")
else
	fibaro:debug("Mode jour : presence (1) : OK")
end

-- Mode jour avec 1 personne à  la maison
fibaro:setGlobal("iphoneSeb", "0")
fibaro:sleep(500)
if (tonumber(fibaro:getValue(63, "armed")) > 0) then 
	fibaro:debug("Mode jour : presence (0) : OK")
else
	fibaro:debug("Mode jour : presence (0) : ERRRORRRR")
end

@moicphil

Quand tu as rajouter les 2 iphones comme triggers tu as enlever le jour_nuit. c'est dommage sinon car si les 2 sont à  la maison et que cette dernière passe en mode "nuit" le scénario ne s'exécute pas. Sinon, c'était du 100%  :P

Posté(e)

Bonsoir à  Tous,

 

merci pour ces encouragements. Alors ce que je veux

 

mode Jour:

Si IphoneSeb ou iphone Anne present

Alors Porte désarmée

Sinon armée

mode nuit

porte armée

 

Le mode jour/nuit est mis à  jour par une scene:

 

--[[
%% autostart
%% properties
%% globals
--]]


local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == fibaro:getValue(1, "sunriseHour")) )
)
then
fibaro:setGlobal("jour_nuit", "jour");
end


setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else


local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
fibaro:setGlobal("jour_nuit", "jour");
end


end

Donc oui cela met à  jour une variable Globale. (je pensais les mettre sur un module virtuel en main loop)

 

Les iphones, c'est aussi via sur un module virtuel en main loop

 

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


-- Ping v 1.0.1 [05-2013]
-- Copyright © 2013 Jean-christophe Vermandé


fibaro:log("Start process");


local _deviceIp = "192.168.0.35";
local _devicePort = 62078;
local _maxRetryProcess = 5;


-- recursive function to ping device
local function _ping(retry)
  retry = retry or 0;
  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --notify user
  fibaro:log("Search on the local network, try #" .. retry .. " please wait...");
  fibaro:sleep(250); 
  --send packet
  local bytes, errorCode = tcpSocket:write("test");
  --check for error   
  if errorCode == 0 then
    return true;
  else
    if retry < _maxRetryProcess then
      fibaro:log("Retry process, please wait...") ;
      fibaro:sleep(1000);
      return _ping(retry + 1);
    end
    return false;
  end
end


--ping device, secure with pcall to catch errors.
local f, result = pcall(_ping);


if (f) then
  if (result == true) then
    fibaro:log("Device has been found, is awake and listening.");
    fibaro:setGlobal("iphoneSeb", "1");
     fibaro:setGlobal("iphoneSeb_Text", "Present");
  else
    fibaro:log("Device was not found!");
    fibaro:setGlobal("iphoneSeb", "0");
      fibaro:setGlobal("iphoneSeb_Text", "Absent")
  end
else
  fibaro:log("Error: " .. f);
  
end


local Seb = fibaro: getGlobal("iphoneSeb");
  local Seb_Text = fibaro: getGlobal("iphoneSeb_Text");
fibaro:log(Seb_Text) ;
fibaro:call(32,"setProperty", "ui.Label1.value", Seb_Text);


fibaro:log("Start process");


local _deviceIpAnne = "192.168.0.12";
local _devicePortAnne = 62078;
local _maxRetryProcessAnne = 5;


-- recursive function to ping device
local function _ping(retryAnne)
  retryAnne = retryAnne or 0;
  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIpAnne, _devicePortAnne);
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --notify user
  fibaro:log("Search on the local network, try #" .. retryAnne .. " please wait...");
  fibaro:sleep(250); 
  --send packet
  local bytesAnne, errorCodeAnne = tcpSocket:write("test");
  --check for error   
  if errorCodeAnne == 0 then
    return true;
  else
    if retryAnne < _maxRetryProcess then
      fibaro:log("Retry process, please wait...");
      fibaro:sleep(1000);
      return _ping(retryAnne + 1);
    end
    return false;
  end
end


--ping device, secure with pcall to catch errors.
local fAnne, resultAnne = pcall(_ping);


if (fAnne) then
  if (resultAnne == true) then
    fibaro:log("Device has been found, is awake and listening.");
     fibaro:setGlobal("iphoneAnne", "1");
    fibaro:setGlobal("iphoneAnne_Text", "Presente");
  else
    fibaro:log("Device was not found!");
     fibaro:setGlobal("iphoneAnne", "0");
    fibaro:setGlobal("iphoneAnne_Text", "Absente")
  end
else
  fibaro:log("Error: " .. fAnne);
end


local Anne = fibaro: getGlobal("iphoneAnne");
local Anne_Text = fibaro: getGlobal("iphoneAnne_Text");


fibaro:log(Anne_Text) ;
fibaro:call(32,"setProperty", "ui.Label2.value", Anne_Text);


Fibaro: sleep(3 * 1000);

Bon je teste ce que tu m'as donné...

 

Merci encore de votre aide

 

Sébastien

Posté(e)

Bonsoir

 

Si tu testes ton code en modifiant la valeur des variables globales depuis le Panneau des variables .. je te rassure de suite, cela ne va jamais fonctionner. En effet, quand tu modifies une variable depuis le Panneau de Variables les scénarios ne sont pas déclenchés  :(

 

 

 

Pour cela, il faut que je récupère la valeur de la Global variable en local?

 

Est ce que ce que je montre plus haut pour pister l'iphone est bon? Pareil je le mets en local?

 

Merci

 

Sébastien

Posté(e)

Bonjour,

 

je reviens car cela ne marche toujours pas... grrrrr bon je suis en Version 4.etc grrr

 

voici mon script:

 

local startSource = fibaro:getSourceTrigger();
local jour_nuit = fibaro:getGlobal("jour_nuit");
fibaro:debug(jour_nuit);
local iphoneAnne1 = tonumber(fibaro:getGlobalValue("iphoneAnne"));
fibaro:debug(iphoneAnne1);
local iphoneSeb1 = tonumber(fibaro:getGlobalValue("iphoneSeb"));
fibaro:debug(iphoneSeb1);


if
 jour_nuit == "jour"
then
    if(
 iphoneAnne1 == 1
or
 iphoneSeb1 == 1


)


then
fibaro:call(80, "setArmed", "0");
Fibaro:debug("Non Arme");
else
fibaro:call(80, "setArmed", "1");
Fibaro:debug("Arme");
end
else
fibaro:call(80, "setArmed", "1");

end

et le message d'erreur:

[DEBUG] 11:32:56: jour
[DEBUG] 11:32:56: nil
[DEBUG] 11:32:56: 0
[ERROR] 11:32:56: line 24: attempt to index global 'Fibaro' (a nil value)

C'est dans une scène...

 

Merci de votre aide

 

Par contre ce qui peut aider, mon détecteur de porte figaro se comporte bizarrement. Quand je l'arme manuellement, et le désarme manuellement, il n'accepte pas mon code PIN alors que si je le fait sur l'IPAD, il veut bien. J'ai l'impression que l'alarme anti sabotage a été déclenchée. Mais comment la désactiver.... grrrr

Posté(e)

EN plus je dis des bêtises car il faut les guillements.

Met des debug pour vérifier que ton code passe bien les if.

Posté(e)

J'ai essayé avec le module de detection de mouvement FGMS001 Motion Sensor. 

 

Dés que je veux l'armé manuellement sur mon ordo, il ne reconnait pas mon code pin et si j'essaye avec l'ipad, cela fonctionne... J'ai l'impression d'avoir un problème avec l'alarme. C'est peut être lié à  ma scène

×
×
  • Créer...