Aller au contenu
Berale64

De L'utilisation Des Triggers

Recommended Posts

J'y comprends plus rien.

Ma VG change deux fois par jour.

Le premier changement vient d'être pris en compte.

 

Attendons la suite !!!!!

Partager ce message


Lien à poster
Partager sur d’autres sites

Attention il faut mettre a jour la VG avec une valeure différentes si la valeure est identique àla valeure de la VG il n'y aura pas de declenchement par trigger

Partager ce message


Lien à poster
Partager sur d’autres sites

Perso, j'allais dire que le code est correct :)

 

Il faudrait voir le déclencheur ou l'utilisateur ... pour le 1er on a des pistes pour trouver les soucis*, par contre pour le 2ème ... aie, aie, aie  ;)

 

* Ne pas utiliser le panneau des variables, ne pas changer la variable via un API, bien changer la valeur de la variable, ...

 

 

MAIS BON, on s'en fiche, car tout refonctionne du côté de la box ... pour l'utilisateur ... c'est encore un peu flou.  :blink:

Partager ce message


Lien à poster
Partager sur d’autres sites

voila ce que j'utilise pour l'heure au lieu d'un do while true j'utilise les triggers mais bon je pense que les triggers sont dans une sorte de do while true lol

--[[
%% autostart
%% globals
DemiHeure
--]]
fibaro:debug("Demarrage en cours...")
fibaro:sleep(60*1000)
local NbreScene = fibaro:countScenes()
fibaro:debug("Nombres de Scéne en cours : "..NbreScene)
local Minutes = tonumber(os.date("%M", os.time()))
local Pause = 0
if Minutes > 30 then
  Pause = 60 - Minutes
  else
  Pause = 30 - Minutes
end
fibaro:debug("Mise a jour Variable : "..Pause.."mn")
fibaro:sleep(Pause*60*1000)
Minutes = tonumber(os.date("%M", os.time()))
fibaro:debug(Minutes)
fibaro:setGlobal("DemiHeure", Minutes)
if Minutes == 0 then
   local Heure = tonumber(os.date("%H", os.time()))
   fibaro:setGlobal("Heure", Heure)
end

cela met a jours 2 variables globales Heures et minutes comme cela change en permanence pas de soucis pour les valeurs

 

Ensuite lorsque j'ai besoin de surveiller une heure en particulier comme le matin au reveil j'ai fais cela il faut encore que j'optimise le code

--[[
%% globals
Heure
--]]
----------------------------------------------------------------------
--   Contrôle si 1 Scène et déjà  en cours et le déclencheur a 6h    --
----------------------------------------------------------------------
local NbreScene = fibaro:countScenes()
if NbreScene ~= 1 then
   fibaro:debug("Il y a déjà  une instance en cours... ")
   fibaro:abort();
elseif heureDeclenchement ~= 6 then
   local heureDeclenchement = tonumber(fibaro:getGlobalValue( "Heure" ))
   fibaro:debug("le déclencheur n'est pas 6h")
   fibaro:abort();
end
-----------------------------------------------------------------------
-- les conditions pour que la scéne démarre sont rempli
-----------------------------------------------------------------------
local idHue = {160, 161, 162}
local ID ={
    ["Onkyo"] = 192,
    ["LumiereEntrer"] = 11,
    ["Det_Garage"] = 182,
    ["PorteGarage"] = 13,
	["VoletChPascal"] = 19
    }
local Jour_Nuit = "Nuit"--fibaro:getGlobalValue( "Jour_Nuit" )
local JourChome = "NON" --fibaro:getGlobalValue( "JourChome" )
local Conges = "NON"--fibaro:getGlobalValue( "Conges" )
local IdTel = fibaro:getGlobalValue( "IdI9305" )
fibaro:debug("il fait "..Jour_Nuit)
fibaro:debug("Jour Ferié "..JourChome)
fibaro:debug("Congés "..Conges)


----------------------------------------------------------------------
-- Recupération de la valeur d'un module
----------------------------------------------------------------------
function ValeurModule(id, body, valeur)
      local body = tonumber(fibaro:getValue(id, body))
      if (valeur == "turnOn" and body == 0) then
         fibaro:call(id, valeur)
      elseif (valeur == "turnOff" and body == 1) then
         fibaro:call(id, valeur)
      else
      fibaro:debug("Deja allumer")
	  end
end     

----------------------------------------------------------------------
-- Commande lampe Philips HUE
----------------------------------------------------------------------
function hue(valeur)
       
        for i=1,#idHue do
		   ValeurModule(idHue[i], "ui.onOff.value", valeur)
        end
end
----------------------------------------------------------------------
-- Si je ne travail pas la scéne s'arrete
----------------------------------------------------------------------
if JourChome == "OUI" or Conges == "OUI" then
   fibaro:debug("Je ne travail pas")
   fibaro:abort()
end
local Heure = os.date("%H:%M", os.time())
while Heure >="06:00" and Heure < "07:20" do
   Heure = os.date("%H:%M", os.time())
   print("Heure actuelle ", Heure)
   ----------------------------------------------------------------------
   -- 6h00
   ----------------------------------------------------------------------
   if Heure == "06:00" then
      fibaro:debug("Je travail")
   
      -- Allumer l'ampli ONKYO
      ValeurModule(ID["Onkyo"], "power", "turnOn")
      fibaro:call(ID["Onkyo"], "setVolume", "50")
      fibaro:call(ID["Onkyo"], "setInput", "NET")
      fibaro:call(108, "turnOn")
      if Jour_Nuit == "Jour" then
         fibaro:debug("il fait jour")
         -- Ouvrir le volet de la chambre
         fibaro:call(ID["VoletChPascal"], "open")
      else
         -- allumé les HUE car il fait nuit
         fibaro:debug("il fait nuit")
         hue("turnOn") 
      end
   end

   ------------------------------------------------------------------
   -- 6h55
   ------------------------------------------------------------------
   if Heure == "06:55" then
      if JourChome == "NON" and Conges == "NON" then
         fibaro:debug("Je travail")
         -- Eteondre l'ampli ONKYO
         fibaro:call(ID["Onkyo"], "setInput", "CBL/SAT")
         fibaro:sleep(10*1000)
         fibaro:call(ID["Onkyo"], "turnOff")
         -- Hue
         hue("turnOff") 
         -- couloir
         if Jour_Nuit == "Nuit" then
            fibaro:call(ID["LumiereEntrer"], "turnOn")
         end
         -- porte Garage
         if tonumber(fibaro:getValue(ID["Det_Garage"], "value")) == 1 then
            fibaro:debug("La Porte est deja ouverte")
         else
            fibaro:call(ID["PorteGarage"], "turnOn")
         end 
      else
         fibaro:debug("Je ne travail pas")
      end
   end
   ----------------------------------------------------------------------------
   -- 7h10 controler et tout éteindre
   ----------------------------------------------------------------------------
   if Heure == "06:56" then
      if tonumber(fibaro:getValue(ID["Det_Garage"], "value")) == 0 then
         fibaro:debug("La Porte est Fermer")
      else
         for i=1,10 do
            fibaro:call(IdTel, "sendPush", i .."/10 - La porte du Garage est ouverte")
            if tonumber(fibaro:getValue(ID["Det_Garage"], "value")) == 0 then
               i = 10
            end
            fibaro:sleep(30*1000)
         end
         fibaro:call(ID["PorteGarage"], "turnOn")
      end 
      -- couloir
      fibaro:call(ID["LumiereEntrer"], "turnOff")
   end
  fibaro:sleep(60*1000)
end 
fibaro:debug("Fin de la boucle")





plutôt qu'une while do true de je fais while Heure >="06:00" and Heure < "07:20" do

 

Il y a pleins de solution avec les triggers et l'avantage c'est que la scéne ne tourne pas en permanence

 

pour les volets j'ai fais comme cela script pour mettre a jours les VG et j'utilise cela pour gérer mes volets

--[[
%% globals
SoleilLever
SoleilCoucher
Heure
--]]
----------------------------------------------------------------------------
-- Recupération de nom du trigger et de ca valeur
----------------------------------------------------------------------------
local trigger = fibaro:getSourceTrigger()
if (trigger['type'] == 'global') then
  nomTrigger = trigger['name']
  valeurTrigger = tonumber(fibaro:getGlobalValue(nomTrigger))
  print("Nom du déclencheur = ", nomTrigger, " - Minutes : ", valeurTrigger)
else
  fibaro:debug("La scéne ne peut être lancer que par une Variable Globale")
  fibaro:abort();
  --nomTrigger = "Heure" -- pour test
  --valeurTrigger = 6 -- pour test
end
-----------------------------------------------------------------------------
-- Tables avec nom et ID des modules
-----------------------------------------------------------------------------
local mesvolets ={
    ["Bureau"] = 5,
    ["Ch_Amis"] = 7,
    ["Chaufferie"] = 9,
    ["Ch_Enfants"] = 17,
    ["Ch_toto"] = 19,
    ["Cuisine"] = 23,
    ["SAM"] = 25,
    ["SdB"] = 27,
    ["Salon"] = 29,
  }
-- Table Zone (Groupes de modules)
local RDC = {"Bureau", "Ch_Amis", "Chaufferie"}
local Rue = {"Bureau", "Cuisine", "SAM"}
local Jardin = {"Chaufferie", "Ch_Amis", "SdB"}
local Chambre = {"Ch_toto", "Ch_Enfants"}
--------------------------------------------------------------------------
-- Recuperation des valeurs des variables globales
--------------------------------------------------------------------------
local nomLever = "SoleilLever" --> Nom de la Variable Globale lever soleil
local nomCoucher = "SoleilCoucher" --> Nom de la Variable Globale coucher soleil
local Heure = "Heure" --> Nom de la variable globale Heure
local JourChome = fibaro:getGlobalValue("JourChome") --> Nom de la variable Module Virtuel Hansloo
local Conges = fibaro:getGlobalValue("Conges")
local VacScolaire = tonumber(fibaro:getGlobalValue("VacScolaire"))
local IdTel = fibaro:getGlobalValue("IdI9305") -- Recuperation de id du tel pour le push
local Pause = 0 -- Temp de pause entre chaque commande de modules en seconde
----------------------------------------------------------------------------
-- Force JourChome a OUI si VacScolaire = 0 ou Conges = "OUI"
----------------------------------------------------------------------------
if VacScolaire == 0 or Conges == "OUI" then
  JourChome = "OUI"
end

----------------------------------------------------------------------
-- Envoi d'un Push pour avertir que le box à  démarrer ou redémarrer --
----------------------------------------------------------------------
function EnvoiPush(Message)
        fibaro:debug("Envoi Push : "..Message)
        fibaro:call(IdTel, "sendPush", Message)
end

-----------------------------------------------------------------------
-- Test si la valeur a enoyer est différente de la valeur du module
-----------------------------------------------------------------------
function testvaleur(id, valeurs)
         local GetValeur = tonumber(fibaro:getValue(id, "value"))
         if valeurs ~= GetValeur then
            fibaro:call(id, "setValue", valeurs)
            --fibaro:debug(id.." - action en cours... - Valeur "..valeurs)
            fibaro:sleep(Pause*1000)
         end
end

----------------------------------------------------------------------------
-- Recupération de l'id par rapport au nom de la tables mesvolets
----------------------------------------------------------------------------
function volets(zone, valeurs)

        if (type(zone) == "table") then 
           local messages = "Les "..#zone.." Volets : "
           for i,v in ipairs(zone) do
              messages = (messages..v..", ")
              local id = mesvolets[v]
              if id == nil then
                 fibaro:debug("ERREUR NOM DU VOLET - "..v.." - dans une table")
                 EnvoiPush("ERREUR NOM DU VOLET - "..v.." - dans une table")
              else
                 testvaleur(id, valeurs) 
              end
           end
           messages = (messages.."ont été actionnés à  "..valeurs.."%")
           EnvoiPush(messages)
        elseif (type(zone) == "string") then
           local id = mesvolets[zone]
           if id == nil then
              fibaro:debug("ERREUR DANS LE NOM DU VOLET : "..zone)
              EnvoiPush("EERREUR DANS LE NOM DU VOLET : "..zone)
           else
              testvaleur(id, valeurs)
              EnvoiPush("Le volet : "..zone.." a été actionné à  "..valeurs.."%")
           end
        else
           fibaro:debug("Erreur......")
           EnvoiPush("Erreur......")
        end
end

--------------------------------------------------------------------
-- test si le déclencheur est lever ou coucher du soleil
--------------------------------------------------------------------
function Test(zone, valeurs, minutes)
        if zone ~= nil then
           if minutes == nil then;
              minutes = 0
           end
           volets(zone, valeurs)
        else
           fibaro:debug("Erreur dans la table ou table inéxitante")
           EnvoiPush("Erreur dans la table ou table inéxitante")
        end 
end

--------------------------------------------------------------------
-- test Lever
--------------------------------------------------------------------
function lever(zone, valeurs, minutes, Jchome)
        if nomTrigger == nomLever and valeurTrigger == minutes then
           if Jchome == JourChome or Jchome == nil then
              Test(zone, valeurs, minutes)
           end
        end
end

--------------------------------------------------------------------
-- test Coucher
--------------------------------------------------------------------
function coucher(zone, valeurs, minutes, Jchome)
        if nomTrigger == nomCoucher and valeurTrigger == minutes then
           if Jchome == JourChome or Jchome == nil then
              Test(zone, valeurs, minutes)
           end
        end
end
--------------------------------------------------------------------
-- test Heure
--------------------------------------------------------------------
function heure(zone, valeurs, minutes, Jchome)
        if nomTrigger == Heure and valeurTrigger == minutes then
           if Jchome == JourChome or Jchome == nil then
              Test(zone, valeurs, minutes)
           end
        end
end

--------------------------------------------------------------------------
-- Demarrage du programme
--------------------------------------------------------------------------
-- Ne rien modifier au dessus de cette ligne
-------------------------------------------------------------------------
-- Commandes a écrit pour lever du soleil
-- lever (Funtion qui traite le lever du soleil
-- coucher(zone, valeur, minutes)
-- exemple pour actionné les volets de la table Rue a 80% 10 minutes avant le lever
-- lever(Rue, 80, -10)
-- exemple pour actionné le volet "Bureau" au lever du jour
-- lever("Bureau", 99, 0)
-- Pour actionner un volet au coucher du soleil
-- Il faut remplacer lever par coucher
-- ex : coucher(Rue, 0, 20)
------------------------------------------------------------------------

heure("Ch_toto", 99, 6, "NON")
lever("Ch_Enfants", 99, -15)
lever(Rue, 99, 10)
lever(Jardin, 99, -15)
lever("Salon", 99, -15)

coucher(Rue, 0, 0)
coucher(Chambre, 0, 10)
coucher(Jardin, 0, 30)
coucher("Salon", 85, 30)





  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

 

* Ne pas utiliser le panneau des variables, ne pas changer la variable via un API, bien changer la valeur de la variable, ...

 

Merci Steven. J'ai bien expérimenté toutes ces petites subtilités.

Voilà  matière pour mprinfo pour un beau tuto en couleur !!! :60:

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai plus trop le temp avec les beaux jours qui arrivent je joue plus trop avec ma box ca pas mal de taf en extérieur

Partager ce message


Lien à poster
Partager sur d’autres sites

salut  tous

j'ai une question 

 

est-il possible dans un module virtuel de faire en sorte, qu'il presse le bouton a  chaque foie que mon module(un walplug) change d'état.

 

--[[
%% properties
664 value
664 power
%% globals
google1
--]]

local trigger = fibaro:getSourceTrigger()
fibaro:call(87, "pressButton", "1")

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, tu fais une scène qui appuye sur le bouton du vd 

Partager ce message


Lien à poster
Partager sur d’autres sites

salut jojo

 

aiii le probleme est que rallonge mon exécution

 

changement d'état du module ----> scène ---> bouton  ---->  exécution du script

 

alors un autre question

 

Mon module virtuel exécute une requête HTTP grâce à   Net.FHttp......

 

est il possible de faire la meme chose directement dans une scène ? 

Partager ce message


Lien à poster
Partager sur d’autres sites

oui,

Il y a moyen de faire des requètes HTTP au départ de scènes. La syntaxe est différentes que depuis un VD.

Perso, je n'y entends pas grand chose, mais il me semble avoir vu dans un autre topic que tu faisais des requêtes http depuis des scènes.

C'est le même principe.

Partager ce message


Lien à poster
Partager sur d’autres sites

A bon, j'utilise toujours des vd


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Depuis une scene : Net.HTTPClient :-)

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×