Aller au contenu

Support Gea


Steven

Messages recommandés

Bonjour Steven,

 

Voilà  j'en suis à  mon ID événement 49... à‡a avance donc bien de mon coté.

J'ai vu que tu avais aussi bien avancé sur la V4, que je n'ose pas encore tester, mon système est tout frais et la sagesse me pousse à  attendre :)

 

Pour la gestion d'un puits canadien qui alimente ma VMC (il s'agit d'un vrai puits avec de l'eau) j'utilise le code suivant :

-- Maintien de température
-- température extérieur est 6° en dessous de la température du puit
local tempdelta=fibaro:getGlobalValue("KWL_Puit_Temp")-6
GEA.add({"Global-", "Netatmo_ExtTmp", tempdelta}, 60*60, "Mise en route du puit canadien #value#", {{"turnOn", id["LOC_VMC_PUI"]}, {"If", {{"Global+", "KWL_Maintien", 0},{"Value+", id["LOC_VMC_KWL"], 0}, {"Value-", id["LOC_VMC_PUI"], 1}}}}) 
GEA.add({"Global+", "Netatmo_ExtTmp", tempdelta}, 60*60, "Arret du puit canadien #value#", {{"turnOff", id["LOC_VMC_PUI"]}, {"If", {{"Global+", "KWL_Maintien", 0},{"Value+", id["LOC_VMC_PUI"], 0}}}}) 

En fait je me suis aperçu que la tempdelta était assigné une fois que le script est lancé alors qu'en fait cette donnée va varier dans le temps.

En fonction du mouvement du puits il peut y avoir des différences significatives et il faudrait que cette valeur soit au plus juste.

 

Pourrait on, comparer deux variables dans global+ un peu comme celà  :

GEA.add({"Global-", "Netatmo_ExtTmp", {"Global~", "KWL_Puit_Temp"}}, 60*60, "Mise en route du puit canadien #value#", {{"turnOn", id["LOC_VMC_PUI"]}, {"If", {{"Global+", "KWL_Maintien", 0},{"Value+", id["LOC_VMC_KWL"], 0}, {"Value-", id["LOC_VMC_PUI"], 1}}}})  

La fonction Global~ irait chercher la valeur de la variable dans l'instant du test.

Cela permetterait de faire des calculs sur les variables dans les conditions.

PS : j'ai laissé la "value+" car en négatif j'inverse les tests et pour l'instant ca me permet de vérifier mon code :(

 

Après si il est possible de faire la même chose avec une combinaison de if je suis preneur.

 

Amicalement

Séb

Lien vers le commentaire
Partager sur d’autres sites

Merci pour le partage, il faut vraiment que je simplifie ces IF c'est une horreur ces truc :)

 

Si on pouvait faire ainsi, cela serait quand même plus parlant :

GEA.add({{"Global+", "Netatmo_ExtTmp", tempdelta}, {"Global+", "KWL_Maintien", 0}, {"Value+", id["LOC_VMC_PUI"], 0}}, 60*60, "Arret du puit canadien #value#", {{"turnOff", id["LOC_VMC_PUI"]}}) 
Lien vers le commentaire
Partager sur d’autres sites

En fait pour l'ordre des conditions on s'y fait parfaitement. 

D'autant plus que ton système avec les if à  la fin permet certainement d'accélérer le traitement, la première condition étant celle qui déclenche la suite.

 

la problématique est  si le script est lancé aujourd'hui avec tempdelta=15° et que demain la variable à  bougé, est ce que tempdelta sera remis à  jour sans relancer le script ?

Je ne l'ai pas constaté.

 

En fait mon problème et là , sur la remise à  jour d'une variable appartenant au deuxième membre de ton test qui soit est statique ou instancié qu'une seule fois au démarrage, ce qui revient au même.

 

As tu une solution à  ce problème ?

 

Excuse moi encore si je n'ai pas réussi à  trop expliquer le contexte :)

D'avance merci.

Séb

Lien vers le commentaire
Partager sur d’autres sites

 

Merci pour le partage, il faut vraiment que je simplifie ces IF c'est une horreur ces truc :)

 

 

Salut Steven,

 

La première ligne résume ce  à  quoi je pensais après avoir cherché deux heures à  faire fonctionner le code ci-dessous:

Je pense que j'y suis arrivé, on verra ce soir au retour de ma femme ;-) 

local cond_pres_GG = {"If",{{"Global", "PresentState", "Away"},{"Global", "Lock_Away", "Unlocked"}, {"Global", "Phone_GG_Present", "1"}}}
  GEA.add({"Global", "Phone_GG_Present", "1"},-1 , "Phone GG Present -> Alarm OFF", {{"Global", "PresentState", "At_Home"}, cond_pres_GG })

J'avais deux soucis pour ce code,

1) il prends du temps a tester car il y a beaucoup de gestion de temps (en dehors de GEA) 

2) faire fonctionner le IF :-/

 

Pour le deuxième point, effectivement c'est casse tête mais je ne vois pas trop comment simplifier.

 

Ce qui aide beaucoup par contre, et c'est là  que je veux y venir, ce sont les exemples.

Créer un fil (modéré), style "postez vos codes GEA ici" ou chacun pourrait poster sa config complète de GEA, VALIDES ET QUI FONCTIONNENT, je pense aiderait beaucoup, car même si le tuto est bien fait, on a du mal à  écrire son code particulier et ce sont souvent des bêtises qui font que ça ne fonctionne pas.

Dans mon dernier cas, il n'y avait pas d'exemples avec des if avec des variables globale, à  réaction instantanée.

 

edit: pour info, le script ci-dessus à  bien fonctionné :-)

Lien vers le commentaire
Partager sur d’autres sites

 

 

Merci pour le partage, il faut vraiment que je simplifie ces IF c'est une horreur ces truc  :)

 

Si on pouvait faire ainsi, cela serait quand même plus parlant :

GEA.add({{"Global+", "Netatmo_ExtTmp", tempdelta}, {"Global+", "KWL_Maintien", 0}, {"Value+", id["LOC_VMC_PUI"], 0}}, 60*60, "Arret du puit canadien #value#", {{"turnOff", id["LOC_VMC_PUI"]}})

 

Effectivement, c'est une bonne idée, et peut être aussi penser à  la possibilité d'utiliser des OR et parenthèses, ça évitera de créer deux lignes gea pour coller à  deux situations similaires.

 

Je n'ai pas encore utilisé de groupes, mais j'ai l'impression qu'ils pourraient être mergés avec les if, ça a l'air similaire, je me trompe ?.

 

edit:

Je pense que j'ai compris, avec les if, il n'y a pas moyen de mettre des conditions de durée.. ?

je cherchais à  faire ceci:

 

Le soir je rentre 2 heures après ma femme, et je voudrais que mon pc s'allume automatiquement dès que j'arrive chez moi.

GEA.add({"Global", "PresentState", "Away"}, 15*60, "", {{"Group", 2}})  -- absent au moins 15 minutes
GEA.add({"Global", "PresentState", "At_Home"}, 10*60, "", {{"Group", 2}}) -- quelqun à  la maison depuis au moins 10 minutes
GEA.add({"Global", "Phone_Seb_Present", "1"}, -1, "", {{"Group", 2}})      -- téléphone Seb présent

GEA.add({"Group", 2}, -1, "Seb rentré, allume PC", {{"turnOn", id["PRISE_BUREAU"]}}) -- 

ça ne marchait pas et puis j'ai lu dans ce fil que les groupes c'était dépassé, -> http://www.domotique-fibaro.fr/index.php/topic/1211-support-gea/?view=findpost&p=15651

J'ai essayé de transformer en if:

local cond_pres_Seb_PC = {"If",{{"Global", "PresentState", "At_Home"},{"Global", "Lock_Away", "Unlocked"}, {"Global", "Phone_Seb_Present", "1"}}}
GEA.add({"Global", "Phone_Seb_Present", "1"},-1 , "Phone Seb Present -> Alume PC", {{"turnOn", id["PRISE_BUREAU"]}, cond_pres_Seb_PC })

mais je bloque sur la manière de spécifier que la variable globale PresentState doit avoir été à   "away" pendant au moins 15 minutes.

 

Après avoir repassé quasi toutes les pages de ce forum, je n'ai vu aucun exemple... pas possible ou pas utilisé ?

 

Lien vers le commentaire
Partager sur d’autres sites

ah oui, encore une chose qui pourrait être pratique, c'est un debug, mais uniquement pour un ID, pcq avec une 30aine d'id, suivre ce qui se passe est presque impossible car la fenêtre de débug n'accepte pas beaucoup de lignes et c'est tronqué.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à  tous,

 

Pour faire avancer le schmilblic, j'ai trouvé une solution en m'appuyant sur une variable calculée, mais c'est assez barbare puisqu'il faut allez dans la fonction qui gère la mise à  jour de la variable pour comprendre la condition.

Mais sinon ca marche.

 

Amicalement

Seb (l'autre qui n'est pas encore bien bien) :98:

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

Bonjour,

 

Je propose que l'on ouvre une section pour les "Sébastiens" pour essayer de canalaliser ce flux soudain.

Je propose aussi de nommer Saint Sébastien le patron de la domotique vu les circonstances :98:

 

Séb XIV

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

Bonjour,

Je propose que l'on ouvre une section pour les "Sébastiens" pour essayer de canalaliser ce flux soudain.

Je propose aussi de nommer Saint Sébastien le patron de la domotique vu les circonstances :98:

Séb XIV

Je me sens un peu partagé, je n'ai pas l'habitude et je n'aime pas trop ça ;-)

Modifié par moicphil
Bonjour Sebcbien, merci de ne pas citer le message juste au dessus !
Lien vers le commentaire
Partager sur d’autres sites

Bonjour Steven,

Désolé de t'embêter, mais je ne trouve pas

J'ai tout essayé, cherché tout les exemples de code ici mais ça refuse de fonctionner (prendre le repeat en compte)

 

J'ai essayé toutes les variantes entre ce code ci:

-- Mise à  jour des Présences par détection d'adresses MAC toutes les minutes
GEA.add({"Global", "", ""}, 1*60, "",
{
{"VirtualDevice", id["VD_PRESENCE_SEB"], 1},
{"VirtualDevice", id["VD_PRESENCE_GG"], 1},
{"Repeat"}
  }) 

celui-ci:

-- Mise à  jour des Présences par détection d'adresses MAC toutes les minutes
GEA.add( true, 5, "",
{
{"VirtualDevice", id["VD_PRESENCE_SEB"], "1"},
{"Repeat"}
  }) 

et celui-ci basé sur ton exemple:

-- Chaque heure je rafraichi mon agenda // Every hours I refresh my calendar
GEA.add( true , 60*60, "",
{
{"VirtualDevice", id["VD_AGENDA"], "12"},
{"Repeat"}
})

voici le débug, je ne sais pas pourquoi mais la tâche fonctionne une seule fois, avec un VD ou deux, mais ne se répète pas, elle est suspendue.

 
première execution:
 
[DEBUG] 23:54:23: [ Toujours ] En cours : vérification (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] Check : démarrage vérification (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] Check : vérification des dates (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] isActivate : vérification de l activation (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] isActivate : activé (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] Check : activé depuis 30/1 (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] sendActions : traitement des actions (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] sendActions : !ACTION! : VirtualDevice 109,1 (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 23:54:23: [ Toujours ] Done : tache effectuée et suspendue (ID:28) [VirtualDevice,109,1] [Repeat]
ensuite:
[DEBUG] 00:05:24: [ Toujours ] En cours : vérification (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 00:05:24: [ Toujours ] Check : démarrage vérification (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 00:05:24: [ Toujours ] Check : vérification des dates (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 00:05:24: [ Toujours ] isActivate : vérification de l activation (ID:28) [VirtualDevice,109,1] [Repeat]
[DEBUG] 00:05:24: [ Toujours ] isActivate : activé (ID:28) [VirtualDevice,109,1] [Repeat]
Lien vers le commentaire
Partager sur d’autres sites

Bonjour Steven,

 

Toujours dans le cadre de la gestion de la VMC j'ai le code suivant : 

	GEA.add({"Global+", "VMC_Co2", 475}, 15*60, "VMC 1", {{"Time", "07:00", "23:00"}, {"VirtualDevice", id["VMC"], 1}, {"If", {{"Global-", "VMC_Co2", 600}}}})
	GEA.add({"Global+", "VMC_Co2", 600}, 15*60, "VMC 2", {{"Time", "07:00", "23:00"}, {"VirtualDevice", id["VMC"], 2}, {"If", {{"Global-", "VMC_Co2", 700}}}})
	GEA.add({"Global+", "VMC_Co2", 700}, 15*60, "VMC 3", {{"Time", "07:00", "23:00"}, {"VirtualDevice", id["VMC"], 3}, {"If", {{"Global-", "VMC_Co2", 800}}}})
	GEA.add({"Global+", "VMC_Co2", 800}, 15*60, "VMC 4", {{"Time", "07:00", "23:00"}, {"VirtualDevice", id["VMC"], 4}, {"If", {{"Global-", "VMC_Co2", 900}}}})
	GEA.add({"Global+", "VMC_Co2", 900}, 15*60, "VMC 5", {{"Time", "07:00", "23:00"}, {"VirtualDevice", id["VMC"], 5}, {"If", {{"Global-", "VMC_Co2", 1000}}}})
	GEA.add({"Global+", "VMC_Co2", 1000}, 15*60, "VMC 6", {{"Time", "07:00", "23:00"}, {"VirtualDevice", id["VMC"], 6}})

Cela fonctionne bien mais si les conditions de CO2 bougent dans la fourchette, il est possible que l'action se répète. C'est normal.

Par contre je voudrais que GEA fasse l'action en ayant un test du type Global~ qui est le test "différent de".

En effet je voudrais faire passer la VMC à  l'étage 2 que si elle n'est pas déjà  à  2.

Si j'utilise 

{"Global-", "VMC_ETAGE", 2},{"Global+", "VMC_ETAGE", 2}

La condition ne sera jamais vrai.

Après je pense qu'avec un group et inverse cela peut marcher, mais compte tenu du pavé que j'ai pour les différentes vitesses ca va devenir un peu chaud !

 

Si le <> ou != existait ça ferait un truc du genre :

 

{"Global~", "VMC_ETAGE", 2}

 

Dans ton source il y a 

		elseif (type(id) == "table" and id[1] == "Global+" and #id > 2) then
			GEA.log("isActivate", entry, "type : Global+", false)
			result = tonumber(fibaro:getGlobalValue(id[2])) > tonumber(id[3])
			--mainid = tonumber(id[2])
			if (main) then entry[GEA.keys["VALUE"]] = fibaro:getGlobalValue(id[2]) end
		elseif (type(id) == "table" and id[1] == "Global-" and #id > 2) then
			GEA.log("isActivate", entry, "type : Global-", false)
			result = tonumber(fibaro:getGlobalValue(id[2])) < tonumber(id[3])
			--mainid = tonumber(id[2])
			if (main) then entry[GEA.keys["VALUE"]] = fibaro:getGlobalValue(id[2]) end

est ce qu'un test du type <> ou != serait possible ?

 

Un grand merci pour tes conseils.

Amicalement

Séb

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Oups, effectivement, juste en dessous...

Je ne savais pas que différent s'écrivait "~=", j'avais l'habitude du "!=" ou "<>".

Instinctivement j'avais d'ailleurs mis le "~" au lieu du "!" que tu as utilisé pour ta syntaxe.

Par contre dans tes conditions autorisés il n'y a pas "Global!" et pour cette raison je n'ai pas poussé la recherche  :wacko: :

 Conditions autorisées :
      <Id module>                             -- Identifiant du module *
      {"Global", <nom variable>, <valeur>}    -- Si la variable global X contient la valeur Y
      {"Sensor+", <id module>, <valeur max>}  -- Si la valeur du sensor X est supérieur à  Y
      {"Sensor-", <id module>, <valeur max>}  -- Si la valeur du sensor X est inférieur à  Y
      {"Value+", <id module>, <valeur max>}   -- Si la valeur du module X est supérieur à  X
      {"Value-", <id module>, <valeur max>}   -- Si la valeur du module X est inférieur à  X
      {"Global+", <nom variable>, <valeur>}   -- Si la valeur de la variable globale X est supérieur à  X
      {"Global-", <nom variable>, <valeur>}   -- Si la valeur de la variable globale X est inférieur à  X
      {"Slider-", <id_vd>, <nom slider>, <valeur>}   -- Si la valeur du slider est inférieur à  X
      {"Slider+", <id_vd>, <nom slider>, <valeur>}   -- Si la valeur du slider est supérieur à  X
      {"Label", <id_vd>, <nom label>, <contenu>}   -- Si la valeur du label est égale à  X
      {"Battery", <id module>, <valeur max>}  -- Si l'état de la pile du module X est inférieur ou égale à  X
      {"Batteries", <valeur max>}             -- Si l'état de la pile des 350 premiers ont une pile inférieur ou égale à  X
      {"Dead", <id module>}                   -- Si le module X ne répond plus
      {"Group", <numéro du groupe>}           -- Si le groupe X est valable
      {"SceneActivation", <id module>, <id scene>} -- Si la scene X du module Y est le déclencheur du script
      * Si seul l'Identifiant du module le script considère qu'il doit vérifier si le module est activé.

 

Je change mes événements de suite...

Amicalement

Séb

Lien vers le commentaire
Partager sur d’autres sites

Ca y'est ca marche, j'ai donc fini la vmc, je passe à  la consommation d'eau ...

Je ne vois pas trop comment j'aurais pu faire sans GEA...

J'ai vu que dans la version 4 il y avait des "magic scenes" mais je n'ai pas vu si elles étaient centralisées et si l'implémentation est aisé.

Concernant le rythme des 30s qui est par défaut dans GEA, est ce que tu as déjà  essayé de mesurer l'impact sur la charge de travail du HC2 quand on augmente la fréquence, genre 15s ou 10s ?

Comme la version 4 est multi taches, peut être qu'il sera plus aisé d'accélérer le rythme dans certains cas.

 

Séb

Lien vers le commentaire
Partager sur d’autres sites

Il n'existe aucun outil pour mesurer quoi que ce soit sur la HC2, c'est donc pas vraiment réalisable. Par contre, toutes les 30 secondes GEA corrige son temps d'exécution par rapport au temps qu'a pris la vérification des lignes que tu as rajouter. Je m'explique par un exemple :
 
Dans mon cas, GEA tourne toutes les 30 secondes ... pour contrôler mes 50 lignes il prend 0.03 secondes soit 3 centièmes de secondes... la prochaine éxecution de GEA aura lieu dans 29.97 secondes au lieu de 30.  Cela donne déjà  une première mesure. C'est affiché dans la console :

[DEBUG] 09:50:46: Durée des traitements : 0.03 nouveau délai : 29.97 / tourne depuis 36h 20m 10s

 
Ensuite, cela va dépendre des actions que tu lui as indiqué d'exécuter mais là  par contre, je n'ai aucun contrôle car cela change complètement d'un environnement à  l'autre.
 
Il est aussi possible, mais contraignant, d'avoir 2 ou 3 version de GEA qui tourne en parallèle. Une qui tourne toutes les 5 secondes avec des actions rapides, une de 30 secondes avec des actions standards et une toutes les 5 minutes, ... A toi de voir.
 
Maintenant, de mon côté, je ne vois pas vraiment l'intérêt d'aller en dessous de la barrière des 30 secondes voir 45 secondes. Si j'ai besoin de réactivité, je vais utiliser les déclenchements immédiats, sinon les 30 secondes me vont très bien.
 
 
------
 
Comment tester vos commandes :
 
Personnellement, j'ai 2 instances de GEA qui tourne en parallèle
mini_868394GEAs.png

 

Le 1ère (avec l'icone de Fredo) est celle qui tourne tout le temps en production. La 2ème est celle qui me permet de tester chaque commande séparément. J'y ajoute donc une seule ligne, avec une exécution toute les 10 secondes. Si cela fonctionne bien, je la bascule dans ma 1ère instance.

Une fois terminé, je désactive la 2ème instance.

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

Petite question, est-il possible d'allumer des lumières via une détection de mouvement d'un fibaro motion sensor?

Le motion sensor est un couloir, je voudrais allumer la lampe de ce couloir entre 19h et 23h pendant 1min puis entre 23h et 07h allumer les spots de la cuisine à  60%, c'est possible?

 

Merki :60:

Lien vers le commentaire
Partager sur d’autres sites

Ah bah ça c'est une idée qu'elle est pas c*n du tout :-)

Steven, pas d'avis pour mon/mes problèmes ?

Merci :-)

 

Tu as quel version du GEA ? ... La seule ou le repeat est buggé je suppose (3.81?)  :)

 

@lolomail

local id_motion_sensor = 100
local id_lampe_couloir = 110
local id_spot_cuisine = 120

-- On éteint la lampe du couloir après une minute uniquement entre 19 et 23h
GEA.add(id_lampe_couloir, 60, "" {{"turnOff"}, {"Time", "19:00", "23:00"}})
-- On éteint les spots de la cuisine après une minute uniquement entre 23 et 07h
GEA.add(id_spot_cuisine, 60, "" {{"turnOff"}, {"Time", "23:00", "07:00"}})


-- Sur détection, entre 19 et 23h on allume la lampe du couloir
GEA.add(id_motion_sensor, -1, "", {{"turnOn", id_lampe_couloir }, {"Time", "19:00", "23:00"}})
-- Sur détection, entre 23 et 07h on allume les spots de la cuisine à  60%
GEA.add(id_motion_sensor, -1, "", {{"Value", id_spot_cuisine, 60}, {"Time", "23:00", "07:00"}})
Lien vers le commentaire
Partager sur d’autres sites

Merci Steven pour tes précisions.

 

En fait, sur le plan événementiel, 30s c'est très bien, pour l'action immédiate c'est bien aussi, mais il y a certains cas où en fait le module dors et je dois le réveiller rapidement pour qu'il donne ensuite son état.

Par exemple un détecteur de mouvement agit de suite mais j'ai besoin de savoir si la luminosité extérieure est élevé ou pas. Dans un cas j'allume une lampe, dans l'autre j'ouvre un peu le volet.

 

C'est un exemple mais le capteur en question dehors à  besoin d'un wakeup pour retourner la valeur et plus vite il est fait, plus vite l'action prochaine à  lieu.

Ton idée d'avoir deux scripts qui tourne est bien et je me demande si, une fois le script lancer, on peut modifier la valeur des 30s à  la volée.

Comme ca 99% du temps il tourne à  30s et selon les besoins on donne un petit coup d'accélérateur.

Il faudrait changer la valeur de ta variable checkEvery mais cela posera peut être un problème dans ton "TOTALRUNS" qui ne sera juste que pour la première valeur.

Dans tous les cas avoir un deuxième script pour les actions plus nerveuses me convient parfaitement.

 

Séb

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...