Aller au contenu

Messages recommandés

Posté(e)

@pepite Help, Je n'ai rien sous le yeux. C'était duration ou durationfull ou autre chose ?

Envoyé de mon SM-G935F en utilisant Tapatalk

Posté(e)

Grrrrrrr, essaie avec #duration# en minuscule stp. Je pense que la différence vient de là et que je ne suis qu'une grosse patate :-)

Voici mon test:

 

GEA.add(true, 30, "", {{"Global", "Test", "#duration#"}, {"Repeat"}})

 

 

Voici le contenu de ma variable "Test" après plusieurs passage :

 

30s

1m

1m 30s

2m

2m 30s

...

 

 

 

  • Like 2
Posté(e)

Parfait, tout fonctionne.
Cependant, existe-t-il la possibilité de transformer la valeur d'une variable numérique en un format de date? (ex. 4000 = 1 heure, 6 minutes, 40 secondes ou 1:06:40)

Posté(e)

GEA n'a pas grand chose pour t'aider directement. C'est possible mais pas inclus dans GEA.

Envoyé de mon SM-G935F en utilisant Tapatalk

Posté(e)

Bonjour,

 

J'utilise GEA pour mettre a jour un VD en fonction de plusieurs paramètres: état de l'alarme (variable globale AlarmTrig), et état des fenêtres (variable globale Ouvrants) notamment.

Ci-joint un exemple:

GEA.Add({{"Global","AlarmTrig","Off"},{"Global","Ouvrants","On"}},-1,ACTION1)
GEA.Add({{"Global","AlarmTrig","On"} ,{"Global","Ouvrants","On"}},-1,ACTION2)
GEA.Add({{"Global","AlarmTrig","On"},{"Global","Ouvrants","Off"}},-1,ACTION3)
etc.

Si je met les deux variables globales dans %%globals, ça marche sauf que dans certains cas (ce n'est pas la majorité des cas), les deux variables changent en même temps (même déclencheur) et du coup j'ai plusieurs instances de GEA qui se lancent simultanément pour faire la même chose, avec un message d'erreur. Je sais que je peux augmenter le nombre de sessions simultanées de GEA autorisées mais je ne sais pas si c'est recommandé, et en tous cas c'est pas super élégant.

 

PS: Une solution que je n'ai pas encore testée est de créer une variable globale "chapeau" qui change si l'une des deux autres variables change. Mais je me dis que cette variable chapeau va être modifiée 2 fois dans la même seconde si les variables filles sont modifiées en même temps, donc je risque de revenir à la case départ...

 

Qu'en pensez-vous ?

 

Posté(e)

Perso, j'ai mis le nombre de sessions au maximum est je laisse la HC2 se débrouiller. Résultat : tout fonctionne à merveille

Envoyé de mon SM-G935F en utilisant Tapatalk

Posté(e) (modifié)
Le 31/10/2018 à 13:57, schwinny a dit :

bon je viens de mettre GEA 6.10 en route et j'ai une erreur sur le restart.

[DEBUG] 13:52:11: --------------------------------------------------------------------------------
[DEBUG] 13:52:11: GEA a démarré le 31.10.18 à 13:52:11 ...
[DEBUG] 13:52:11: ... vérification en cours #0 @0s...
[DEBUG] 13:52:11: [1;31m2018-10-31 13:52:11.977885 [ fatal] Unknown exception: /opt/fibaro/scenes/25.lua:772: attempt to index field 'globalvalue' (a nil value)
 

la ligne correspond a ca:

 

 restarttask = {name="RestartTask", 
                    getValue=function(taskid) return GEA.globalvalue:find("|R_" .. taskid.."|") end,
                    action=function(taskid) if (type(taskid) ~= "table") then taskid = {taskid} end for i=1, #taskid do if (taskid=="self") then taskid=GEA.currentEntry.id end GEA.globalvalue = GEA.globalvalue:gsub("|R_" .. taskid.."|", ""):gsub("|M_" .. taskid .. "{(%d+)}|", ""):gsub("|S_" .. taskid.."|", "") .. "|R_" .. taskid.."|" end end
                },

 

J'ai eu exactement le même bug en passant de 6.07 à 6.11 en copiant/collant le code dans la scène du précédent GEA. Le numéro de ligne est différent mais correspond également à la fonction RestartTask (que je n'utilise pas dans mon code). J'ai essayé de coller dans une nouvelle scène mais même erreur.

 

Edit: L'erreur vient du fait que mon GEA n'arrive pas à créer de variable globale. J'ai du créer GEA_Tasks6 manuellement et maintenant tout fonctionne. Mon ancien GEA utilisait GEA_Tasks. Je ne comprends pas pourquoi la fonction api.post ne fonctionne pas chez moi. Quand je fais le test ci-dessous j'ai status = 400.

 

local varName = "VarTest"
local payload = {name=varName, isEnum=0, value="test"}
local response, status = api.post("/globalVariables/"..varName, payload)
fibaro:debug(status)

Edit 2: Ok, j'ai trouvé l'erreur: il faut indiquer isEnum=false et non isEnum=0. Mais l'erreur vient du code GEA 6.11, donc tout le monde doit avoir le même problème ! Vous pouvez tester en effaçant la variable GEA_History (ca n’empêche pas GEA de fonctionner).

 

Modifié par Felig
Posté(e) (modifié)

Je suis en 4.55 (je viens de mettre à jour mon profil).

Modifié par Felig
Posté(e)

J'ai fait d'autres tests: quand la variable est créée la première fois il y a quand même un message d'erreur (le même que ci-dessus) car elle est vide. Je suggère donc la correction suivante (la ligne d'origine est celle qui commence par --)

 

    restarttask = {name="RestartTask", 
         ------------------------ MODIF FELIG ---------------------------------------------------------------------------
         getValue=function(taskid) if tools.isNil(GEA.GlobalValue) then return nil else return GEA.globalvalue:find("|R_" .. taskid.."|") end end,
       --getValue=function(taskid) return GEA.globalvalue:find("|R_" .. taskid) end,
         ------------------------ FIN MODIF ------------------------------------------------------------------------------
         action=function(taskid) if (type(taskid) ~= "table") then taskid = {taskid} end for i=1, #taskid do if (taskid[i]=="self") then taskid[i]=GEA.currentEntry.id end GEA.globalvalue = GEA.globalvalue:gsub("|R_" .. taskid[i].."|", ""):gsub("|M_" .. taskid[i] .. "{(%d+)}|", ""):gsub("|S_" .. taskid[i].."|", "") .. "|R_" .. taskid[i].."|" end end
                },
    stoptask  = {name="StopTask", 
         ------------------------ MODIF FELIG ---------------------------------------------------------------------------
         getValue=function(taskid) if tools.isNil(GEA.GlobalValue) then return nil else return GEA.globalvalue:find("|S_" .. taskid.."|") end end,
       --getValue=function(taskid) return GEA.globalvalue:find("|S_" .. taskid) end,
         ------------------------ FIN MODIF -----------------------------------------------------------------------------
         action=function(taskid) if (type(taskid) ~= "table") then taskid = {taskid} end for i=1, #taskid do if (taskid[i]=="self") then taskid[i]=GEA.currentEntry.id end GEA.globalvalue = GEA.globalvalue:gsub("|S_" .. taskid[i].."|", ""):gsub("|M_" .. taskid[i] .. "{(%d+)}|", ""):gsub("|R_" .. taskid[i].."|", "") .. "|S_" .. taskid[i].."|" end end
                },

 

Posté(e)

Bonjour,

 

Je viens de me lancer dans GEA : j'ai donc installé la 6.11, et mon firmware est 4.55.

 

J'ai cette erreur :

 

[DEBUG] 11:33:37: --------------------------------------------------------------------------------
[DEBUG] 11:33:37: Démarrage automatique de GEA 6.11 (mode autostart)
[DEBUG] 11:33:37: --------------------------------------------------------------------------------
[DEBUG] 11:33:37: Utilisation de minifiertools v. 2.00
[DEBUG] 11:33:37: Vérification automatique toutes les 30 secondes
[DEBUG] 11:33:37: Création de la variable globale : GEA_Tasks6
[DEBUG] 11:33:37: Création de la variable globale : GEA_History
[DEBUG] 11:33:37: --------------------------------------------------------------------------------
[DEBUG] 11:33:37: Recherche de plugins, ... :Aucun plugins trouvé
[DEBUG] 11:33:37: Chargement du code utilisateur setEvents() ...
[DEBUG] 11:33:37: --------------------------------------------------------------------------------
[DEBUG] 11:33:37: Ajout auto : #1 [51][TurnOff]
[DEBUG] 11:33:37: --------------------------------------------------------------------------------
[DEBUG] 11:33:37: GEA a démarré le 17.08.19 à 11:33:37 ...
[DEBUG] 11:33:37: ... vérification en cours #0 @0s...
[DEBUG] 11:33:37: 2019-08-17 11:33:37.996691 [ fatal] Unknown exception: /opt/fibaro/scenes/1046.lua:543: attempt to index field 'globalvalue' (a nil value)

Comme ecrit par Felig, j'ai créé la variable GEA_Tasks6 manuellement et c'est maintenant OK 

Posté(e) (modifié)

Bonjour,

 

Comme beaucoup je trouve la fonction PressButton de Fibaro mal faite: contrairement à un Label qu'on peut sélectionner par son identifiant, un bouton doit être sélectionné en fonction de sa position dans le Virtual Device, ce qui est source d'erreur, et oblige à réécrire toutes les fonctions en cas de modification de la structure du VD. Ci-joint deux fonctions qui permettent de pallier ce problème dans GEA:

 

"PressButtonLabel" permet de sélectionner un bouton en fonction de son libellé (ce qui est affiché dessus). Attention: si plusieurs boutons ont le même libellé dans le même VD, le résultat sera aléatoire!

Exemple d'utilisation: GEA.add({"Time","08:00"},0,"",{"PressButtonLabel",id["VOLETS"]","Monter"})

 

"PressButtonId" permet de sélectionner un bouton en fonction de son identifiant (dans l'onglet Advanced, c'est le nom qui apparait dans le champ "ID:"). Cet identifiant est unique et ne change pas si le reste du VD est modifié.
Exemple d'utilisation: GEA.add({"Time","08:00"},0,"",{"PressButtonId",id["VOLETS"]","BtnMonter"})

 

Laquelle de ces fonctions privilégier ? "PresButtonLabel" est plus intuitif, il suffit de savoir ce qui est affiché sur le bouton pour l'utiliser. "PressButtonId" est cependant plus fiable: l'expérience prouve qu'on ne change jamais l'identifiant d'un bouton, alors que ça peut arriver avec un libellé. Par ailleurs "PressButtonId" utilise un identifiant unique.

 

Autre avantage important commun à ces deux fonctions: le programme vérifiera si le bouton en question existe au démarrage de GEA (par contre si vous modifiez le bouton pendant que GEA est lancé, ce ne sera pas détecté).

 

Pour utiliser ces fonctions, il suffit d'ajouter le code ci-dessous dans la section CONFIGURATION GENERALE de GEA:

 

  GEA.checkButton = function(id,property,text)
    if property ~= "name" and property ~= "caption" then return false end
    local vds = api.get("/virtualDevices/"..id)
    if not(vds) then return false end
    for _, row in pairs(vds.properties.rows) do
      if (row.type == "button") then
        for _, element in pairs(row.elements) do
          if not(element[property]) then return false end
          if element[property] == text then return tostring(element.id) end
        end 
      end  
    end
    return false -- Bouton n'existe pas
  end

  -- ----------------------------------------------------------
  -- PressButtonLabel: Equivalent à PressButton mais sélectionne le bouton
  -- en fonction de son libellé (ce qui est affiché dessus). Attention:
  -- si plusieurs boutons ont le même libellé, le résultat sera aléatoire!
  -- Ex: GEA.add({"Time","08:00"},0,"",{"PressButtonLabel",id["VOLETS"]","Monter"})
  -- ----------------------------------------------------------
  GEA.options.pressbuttonlabel = {
    name = "PressButtonLabel",
    control = function(id,label) if GEA.checkButton(id,"caption",label) then return true
      else return false, string.format(GEA.trad.label_missing, id, label) end end,
    action = function(id,label) fibaro:call(id,"pressButton",GEA.checkButton(id,"caption",label)) end
    }

  -- ----------------------------------------------------------
  -- PressButtonId: Equivalent à PressButton mais sélectionne le bouton
  -- en fonction de son identifiant (modifiable dans l'onglet Advanced).
  -- Cet identifiant unique ne change pas si le reste du VD est modifié.
  -- Ex: GEA.add({"Time","08:00"},0,"",{"PressButtonId",id["VOLETS"]","BtnMonter"})
  -- ----------------------------------------------------------
  GEA.options.pressbuttonid = {
    name = "PressButtonId",
    control = function(id,name) if GEA.checkButton(id,"name",name) then return true
      else return false, string.format(GEA.trad.label_missing, id, name) end end,
    action = function(id,name) fibaro:call(id,"pressButton",GEA.checkButton(id,"name",name)) end
    }

PS: J'imagine que je ne suis pas le seul à avoir eu ce besoin, et sans doute d'autres ont posté des solutions équivalentes, désolé si c'est le cas. Mon code est très largement inspiré de la fonction checkLabel qui a été ajoutée dans GEA 6.10. Merci à @Steven et aux autres développeurs.

PS2: Les noms de mes fonctions sont un peu longs, n'hésitez pas à changer pour VDname et VDid par exemple.

PS3: Pour éviter de modifier GEA j'utilise le même message d'erreur que pour un Label inexistant. Pour les puristes, il faudrait ajouter un message d'erreur spécifique "button_missing" dans les traductions.

 

 

 

Modifié par Felig
  • Like 2
  • Thanks 1
Posté(e)

Bonjour à vous,

J'ai ceci:

GEA.add(id["MVT_CUISINE"], -1, "", {"TurnOn", id["ECL_LED_CUISINE"]}) --Led ON si MVT ON et LUX < xx, éteindre après 2mn
	local LedCuisine = GEA.add(id["ECL_LED_CUISINE"], 2*60, "", {{"turnOff",id["ECL_LED_CUISINE"]},{"Repeat"}})
	GEA.add(id["MVT_CUISINE"], -1, "", {{"RestartTask", LedCuisine}})

J'essaye d'ajouter ceci : {"Value-", id["LUX_CUISINE"], 20} pour que sa déclenche sur le mouvement si LUX < à xx 

Merci pour votre aide :)

Posté(e)

A priori tu n'as besoin ni de Repeat ni de RestartTask. Essaye ceci:

GEA.add({id["MVT_CUISINE"],{"Value-", id["LUX_CUISINE"], 20},{"TurnOff", id["ECL_LED_CUISINE"]}}, -1, "", {"TurnOn", id["ECL_LED_CUISINE"]}) 
GEA.add({id["ECL_LED_CUISINE"],{"turnOff",id["MVT_CUISINE"]}}, 2*60, "", {"turnOff"})

 

Posté(e)

C'est juste pour que la tache ne se déclenche pas si la lumière est déjà allumée. TurnOff utilisé en condition permet de vérifier qu'une device est éteinte.

De même dans la deuxième ligne, {"turnOff",id["MVT_CUISINE"]} permet de s'assurer que la lumière ne s'éteindra que si il n'y pas eu de mouvement pendant 2 minutes.

Posté(e)

Je crois que le "turnoff" ne s'utilise qu'en action et pas en condition. Pour les conditions, il me semble plus pertinent de regarder si value=0

Envoyé de mon SM-A530F en utilisant Tapatalk

Posté(e)

TurnOff peu être utilisé dans les 2 cas : action ou condition. C'est une nouveauté de la version 6.

Envoyé de mon SM-G935F en utilisant Tapatalk

Posté(e)

Dites, je voudrais savoir s'il est possible de faire simplement en une ligne GEA un scénario tout simple :

- récupérer la valeur courante d'un dimmer

- l'allumer à fond

- attendre 10s (avec un sleep, ça je sais faire)

- remettre le dimmer à sa valeur précédente

 

C'est possible de faire ça sans passer par une variable globale ?

 

Posté(e)
Dites, je voudrais savoir s'il est possible de faire simplement en une ligne GEA un scénario tout simple :
- récupérer la valeur courante d'un dimmer
- l'allumer à fond
- attendre 10s (avec un sleep, ça je sais faire)
- remettre le dimmer à sa valeur précédente
 
C'est possible de faire ça sans passer par une variable globale ?
 
Oui c'est possible, il y a VariableCache qui fonctionne comme Global mais qui n'est pas persisté.

Envoyé de mon SM-G935F en utilisant Tapatalk

Posté(e)

Je n'ai pas tenté mais j'expérimenterais un truc du style :


 

ID_DIMMER = 100

GEA.add(
    ..., 30, "";
    { 
       {"VariableCache", "Dimmer", {"Value", ID_DIMMER}}, -- On stocke la valeur du dimmer dans le variable "Dimmer"
       {"Value", ID_DIMMER, 100}, -- On met le dimmer au maximum
       {"Sleep", 10, {"Value", ID_DIMMER, {"VariableCache", "Dimmer"}}} -- Apres 10 secondes on remet la valeur du dimmer a celle contenu dans la variable "Dimmer"   
     }
)

 

  • Like 1
Posté(e)

Ah super, je ne connaissais pas, mais c'est tout à faire le genre d'astuce que je cherchais :13:

 

Merci je testerai demain :)

  • Like 1
×
×
  • Créer...