Aller au contenu
Lazer

Quick App - Gestionnaire d'Événements Automatique - GEA pour HC3

Recommended Posts

il y a 11 minutes, Lazer a dit :

Pour "Program" :

Je te suggère de supprimer les 2 lignes suivantes de la syntaxe :


	{"Program+", <id_module>}
	{"Program-", <id_module>}

Qui sont techniquement possibles, mais n'ont aucun intérêt en pratique... qui aurait le cas d'usage d'aller comparer si le programme n°X est supérieur/inférieur à la valeur Y.... ça n'a juste aucun sens.... ça n'est pas comme comparer une Value (de luminosité, de température, de puissance, etc)

 

en effet

-- "Program" - "StartProgram" : Teste/démarre l'exécution d'un programme d'un module RGBW

	-- SYNTAXE :
	{"Program", <id_module>}
	{"Program!", <id_module>, <id_program>}
	{"Program", <id_module>, <id_program>}

	-- CONDITIONS :
	GEA.add( {"Program", 72}, 30, "", {ACTIONS} )             -- Retourne le programme en cours du RGB dont l'ID est 72
	GEA.add( {"Program!", 72, 3}, 30, "", {ACTIONS} )         -- Vérifie si le programme 3 est en cours du RGB dont l'ID est 72

	-- ACTIONS :
	GEA.add( {CONDITIONS}, 30, "", {"Program", 72, 6} )       -- Démarre le programme 6 du RGB 72
	GEA.add( {CONDITIONS}, 30, "", {"Program", {72, 73}, 6} ) -- Démarre le programme 6 DES RGBS 72 ET 73

 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 05/06/2022 à 12:24, Lazer a dit :

Exemple :


GEA.add({18, {"Value-", 19, 0}}, -1, "Ouverture fenêtre alors qu'il gêle dehors")

En réalité, cette règle se déclenchera lorsque la fenêtre est ouverte, mais également à chaque fois que le température change d'un dixième de degrés tout en restant sous les 0°C.... et cela même si la fenêtre est fermée.... ça va faire beaucoup de notifications !

 

je vais documenter ce point précis et très important à mes yeux.

As-tu voulu faire un test pour voir si je suivais ?

En effet, je suis d'accord qu'un trigger est généré à chaque changement de température (19), même si la fenêtre (18) est fermée => bcp de déclenchements inutiles (et donc la règle GEA est vérifiée plusieurs fois pour rien).

Mais pas de notif (ou d'actions) car toutes les conditions (18=1 et 19<0) ne sont pas remplies. (C'est le principe de GEA de n'exécuter une règle que si toutes les conditions sont remplies ?)

Et je suis donc tout à fait ok avec ta syntaxe adaptée :

GEA.add({18, {"(Value-)", 19, 0}}, -1, "Ouverture fenêtre alors qu'il gêle dehors")

 

Partager ce message


Lien à poster
Partager sur d’autres sites

en fait ce dont tu me parlais avec les () est repris toute à la fin de la doc, dans les "Trucs et astuces".

Tu y confirmes ton explication ci-dessus, mais je n'ai toujours pas compris la logique du raisonnement : je ne comprend pas comment une règle GEA peut être validée si toutes les conditions ne sont pas remplies (seule exception = {"Inverse", #})

?????????????

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 2 heures, jojo a dit :

je vais documenter ce point précis et très important à mes yeux.

As-tu voulu faire un test pour voir si je suivais ?

En effet, je suis d'accord qu'un trigger est généré à chaque changement de température (19), même si la fenêtre (18) est fermée => bcp de déclenchements inutiles (et donc la règle GEA est vérifiée plusieurs fois pour rien).

Mais pas de notif (ou d'actions) car toutes les conditions (18=1 et 19<0) ne sont pas remplies. (C'est le principe de GEA de n'exécuter une règle que si toutes les conditions sont remplies ?)

Et je suis donc tout à fait ok avec ta syntaxe adaptée :


GEA.add({18, {"(Value-)", 19, 0}}, -1, "Ouverture fenêtre alors qu'il gêle dehors")

 

C'est exactement cela, maintenant tu as tout compris :60:

 

Par contre, ce n'était pas un test pour te tester ;)

Mais bien un exemple supposé réel.
Dans le cas de cette règle, l'intention de l'utilisateur est de déclencher l'action instantanément, au moment précis où la porte s'ouvre, tandis que la température est négative.

Cependant, l'effet de bord non attendu, c'est que les actions se déclencheront également à chaque fois que la température varie (ce qui arrive souvent) tandis que la porte est toujours ouverte... pas du tout l'effet attendu.

 

A la réflexion, cet exemple n'était peut être pas le plus pertinent.

Mais c'était surtout la logique que je voulais mettre en évidence, et les effets de bords induits qui peuvent être surprenants si on n'a pas saisit l'utilité des parenthèses.

C'est un cas que j'ai souvent vu sur le topic du support GEA... déjà à l'époque de la HC2, raison pour laquelle Steven a introduit les parenthèses.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Ci-dessous une suggestion pour la fonction de contrôle de "sleep". Ça ne change rien au fonctionnement, mais ça permet d'avoir des messages d'erreur plus explicites dans mes tests:

sleep = {name = "Sleep",
  	control = function(duree, option) 
		if type(duree) ~= "number" then return false, string.format(self.trad.not_number, duree) end
		return self:getOption(option).control()
	end,
 

Pour tester j'ai utilisé:

GEA.add(true,0,"",{"sleep","10",{"Global","varxxx","Test"}},"Test Sleep 1")
GEA.add(true,0,"",{"sleep",10,  {"Global","varxxx","Test"}},"Test Sleep 2")

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour la suggestion, ça sera pour une prochaine version alors :)

 

Tu sais qu'en attendant, plutôt que de modifier le code de GEA dans le fichier main, tu peux définir tes propres options dans ta fonction config() :

function config(GEA)
	...
	GEA.options.sleep = {name = "Sleep",
    	....
	}
}

Normalement si tu redéfinies une option qui existe déjà, l'originale sera replacée par la tienne.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Le 08/06/2022 à 17:40, Lazer a dit :

Par contre, ce n'était pas un test pour te tester ;)

non, c'était bien un test (involontaire) de ta part, car tu avais écrit ceci :

Le 05/06/2022 à 12:24, Lazer a dit :

cela même si la fenêtre est fermée....

mais voyons l'aspect positif, cela m'a obligé de me torturer les méninges pour bien comprendre finalement ...

Le 08/06/2022 à 17:40, Lazer a dit :

tandis que la porte est toujours ouverte

 

Voici donc la v7.37 de la doc/syntaxe.

GEA v7.37 Syntaxe.lua

Modifié par jojo
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah mince alors, désolé, j'ai donc écris une bêtise :wacko:

 

Merci pour la doc à jour, je la mettrai en 1ère page :)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Lazer, Jojo

Merci pour le travail et la nouvelle doc :13:

:77: :77:

Modifié par Ghoosti

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 12 heures, Lazer a dit :

Tu sais qu'en attendant, plutôt que de modifier le code de GEA dans le fichier main, tu peux définir tes propres options dans ta fonction config() :

Je savais que c'était possible pour GEA 6 j'avais écrit quelques options custom, pour sélectionner un label par son contenu notamment, mais j'avais pas encore testé sur GEA 7. Je vais le faire.

J'ai une addiction pour le débogage et les améliorations inutiles désolé, je vais essayer de me contrôler. J'avais aussi amélioré quelques messages dans les logs (une autre de mes maniaqueries), mais sur GEA 7 pas besoin, tu as fait un super boulot, ils sont clairs et esthétiques.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

De rien (cela m'a permis d'apprendre bcp de choses)

Et le temps que j'y ai passé n'est rien comparé au temps que @Lazer a du passer à convertir le code pour la HC3.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui c'était assez long... Mais instructif :)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Je rencontre une difficulté avec GEA 7.37 concernant l'utilisation de VariableCache. Je souhaite récupérer le profil actif avant changement vers un nouveau profil.

Voici mon code :

GEA.add(true, 30, "", {{"VariableCache", "Prev_Profile", "#profile#"}, {"Profile", "AWAY"}}, "test de verif variable en cache")

 

Voici l'erreur qui apparait :

[ERROR] [QA_GEA_205]: Ajout auto #6 : Activation mode précédent Règle exclue : ./include/main.lua:1940: attempt to index a nil value (local 'profileId')

 

j'ai vu sur le forum que Dragoniacs avait rencontrer la même erreur sur la version GEA 6.xx (15 mars 2021). Mais j'ai essayé toutes les solutions proposées et rien ne fonctionne, ça ne s'initialise pas...

Je suis novice, je dois rater quelquechose. Si quelqu'un peut m'aiguiller, car là je capitule! Merci.

Partager ce message


Lien à poster
Partager sur d’autres sites

Il faudra que je reproduise le problème chez moi... mais pas tout de suite.

Si en attendant @Dragoniacs a une idée pour te débloquer :)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors effectivement, GEA est trop rapide et change le profile trop vite.
Du coup, il faut utiliser une tempo "sleep" :

GEA.add(true, 30, "", {{"VariableCache", "Prev_Profile", "#profile#"}, {"Sleep",30,{"Profile", "AWAY"}}}, "test de verif variable en cache")


Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour vos premiers retours.

Je viens de tester : le fait d'ajouter la tempo permet effectivement de valider l'évènement demandé. A indiquer dans une prochaine mise à jour de GEA ?

Néanmoins, après test, je me rends compte qu'il n'initialise pas la variable en cache car lorsque j'appelle mon 2e évènement (retour au mode précédent), il ne revient pas au mode précédent...

 

GEA.add(true, 30, "", {{"VariableCache", "Prev_Profile", "#Profile#"}, {"Sleep", 30, {"Profile", "AWAY"}}}, "Mise en cache du profil")
GEA.add({"Time","16:48","18:50"}, 30, "", {"Profile", {"VariableCache", "Prev_Profile"}}, "Activation mode précédent")

Est-ce que la mise en cache nécessite d'activer une option dans un GEA ? J'avoue que que je sèche...

par ailleurs, en faisant un print(Prev_Profile), il devrait pouvoir m'afficher ce que contient la valeur en cache Prev_Profile, non ?

 

 

 
 

Partager ce message


Lien à poster
Partager sur d’autres sites

vu qu'on parle de variable cache, en relisant la doc, je m'était posé les questions suivantes :

  • c'est quoi précisément ? car je ne connaissais que 2 types de variable : les Globales et celles des QA
  • quelle est sa durée de vie / sa persistance : reboot HC3 ? / sauvegarde ce GEA / 1 cycle de GEA / ??? ?

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 23 heures, RS600807 a dit :

Néanmoins, après test, je me rends compte qu'il n'initialise pas la variable en cache car lorsque j'appelle mon 2e évènement (retour au mode précédent), il ne revient pas au mode précédent...

Là je pense que ça n'a rien à voir avec la gestion des profiles, ta 2nde règle contient une condition de plage horaire, est-ce que tu es bien dans la plage depuis la durée de 30s ?

 

Autre remarque, le Sleep que tu utilises a une tempo de 30s, donc... le profile n'est modifié que 30s après l'exécution de la 1ère règle.

Pas évident de jongler avec la gestion temporelle...

 

Il y a 23 heures, RS600807 a dit :

Est-ce que la mise en cache nécessite d'activer une option dans un GEA ? J'avoue que que je sèche...

Non pas du tout, rien de particulier à faire

 

Il y a 23 heures, RS600807 a dit :

par ailleurs, en faisant un print(Prev_Profile), il devrait pouvoir m'afficher ce que contient la valeur en cache Prev_Profile, non ?

Non, le print() que tu vas mettre dans ta fonction function setEvents() ne va s'exécuter qu'au démarrage de GEA, pas pendant la vérification des règles qui a lieu toute les 30s, car elles sont chargées en mémoire.

Donc GEA ne revient jamais dans la function setEvents()... sauf en cas d'exécution instantanée sur événement / trigger, avec durée = -1

 

 

Il y a 17 heures, jojo a dit :

vu qu'on parle de variable cache, en relisant la doc, je m'était posé les questions suivantes :

  • c'est quoi précisément ? car je ne connaissais que 2 types de variable : les Globales et celles des QA 
  • quelle est sa durée de vie / sa persistance : reboot HC3 ? / sauvegarde ce GEA / 1 cycle de GEA / ??? ?

C'est plus ou moins la même chose qu'une variable locale en LUA... c'est à dire une variable en mémoire RAM, perdue lors du redémarrage de GEA

 

Puisqu'on ne peut pas utiliser les variables locales dans la function setEvents()  (voir explication au dessus), ces "VariableCache" permettent de stocker des informations en mémoire pour être utilisées dans les prochains cycles de GEA.


Exemple, j'en utilise une pour déclencher l'aspirateur 1 seule fois par jour, sans ça il se redéclencherait plusieurs fois par jour dès que la batterie est rechargée :

-- Robot aspirateur Xiaomi Roborock
GEA.add({{"Profile", "Absent"}, {"Value", id["QA_XIAOMI_ROBOROCK"], false}, {"Battery", id["QA_XIAOMI_ROBOROCK"], 100}, {"VariableCache!", "Aspirateur", true}}, 5*60, "", {{"QuickApp", id["QA_XIAOMI_ROBOROCK"], "clean"}, {"VariableCache", "Aspirateur", true}}, "Démarrage aspirateur")
GEA.add({"Time", "00:00", "00:01"}, 0, "", {"VariableCache", "Aspirateur", false}, "VariableCache Aspirateur")

 

Autre exemple, mémoriser la valeur de 2 lumières, les allumer à 100%, faire une action (ici une photo), puis les rétablir à leur niveau précédent, le tout en 1 seule règle :

	GEA.add(
		{
			{"Label", id["VD_OCTOPRINT"], "LabelJob", "Operational"},
			{"Label", id["VD_OCTOPRINT"], "LabelJobProgress", "100.0 %"}
		},
		30,
		"Impression 3D terminée à #time#",
		{
			{"VariableCache", "LED_IMP3D_HAUT", {"Value", id["LED_IMP3D_HAUT"]}},
			{"VariableCache", "LED_IMP3D_COTE", {"Value", id["LED_IMP3D_COTE"]}},
			{"value", {id["LED_IMP3D_HAUT"], id["LED_IMP3D_COTE"]}, 99},
			{"Email", "Christophe", "Octoprint : Impression 3D terminée avec succès à #time#", "GEA : Octoprint"},
			{"Sleep", 10, {"Picture", id["CAMERA_IMPRIMANTE_3D"], "Lazer"}},
			{"Sleep", 15, {"Value", id["LED_IMP3D_HAUT"], {"VariableCache", "LED_IMP3D_HAUT"}}},
			{"Sleep", 15, {"Value", id["LED_IMP3D_COTE"], {"VariableCache", "LED_IMP3D_COTE"}}}
		}
	)

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

 

J'ai fait quelques modification dans mon GEA et je viens de me rendre compte de ceci dans le debug

C'est normale ce warning?

Je n'avais jamais fait attention a cela

[16.06.2022] [14:28:17] [DEBUG] [QA_GEA_53]: Déclencheurs instantanés : 0
[16.06.2022] [14:28:17] [WARNING] [QA_GEA_53]: Aucun déclencheur instantané en mode événement

 

Modifié par flacon030
  • Downvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Il va falloir reprendre l'habitude de poser vos question sur le topic du support GEA les gars ;)

 

Bref, ce message t'informe que tu n'as aucun déclencheur instantanée (durée = -1) parmi tes règles.

  • Downvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci dragoniacs, lazer et jojo pour vos réponses.

Il faut en effet apprendre à jongler avec la dimension séquentielle de GEA. Maintenant que j'ai un peu mieux cerner le fonctionnement avec vos différentes explications, le "sleep" prend tout son sens.

J'ai donc réussi à mettre en place la gestion de mes différents profils, moyennant un délai de 30s avant activation.

Pour ceux à qui ça pourrait aider, voici ce que ca donne avec en plus la gestion des alarmes :

-- *** Profils de la box disponibles : 1=HOME / 2=AWAY / 7=NUIT / 5=FRIENDS / 8=MANUEL
    -- *** Mise en cache du profil
    GEA.add(true, 30, "", {"VariableCache", "Prev_Profile", "#profile#"}, "Mise en cache du profil")

    -- *** Activation des profils
    -- 1=HOME
    GEA.add({{"VariableCache", "Jour_Nuit", "Jour"}, {"Or", {"VariableQuickApp", 190, "PRES_STEPHANE", true}, {"VariableQuickApp", 201, "PRES_LISE", true}}, {"VariableCache!", "Prev_Profile", "FRIENDS"}}, 30, "", {"Profile", "HOME"}, "Mode HOME activé (par détection de présence)")

    -- 2=AWAY
    GEA.add({{"VariableCache", "Jour_Nuit", "Jour"}, {"VariableQuickApp", 190, "PRES_STEPHANE", false}, {"VariableQuickApp", 201, "PRES_LISE", false}}, 30, "", {{"VariableCache", "Prev_Profile", "#profile#"}, {"Sleep", 30, {"Profile", "AWAY"}}}, "Mode AWAY activé (par détection de présence)")

    -- 7=NUIT
  GEA.add({{"VariableCache", "Jour_Nuit", "Nuit"}, {"Or", {"VariableCache", "Etat_Steph", true}, {"VariableCache", "Etat_Lise", true}}}, 30, "", {{"VariableCache", "Prev_Profile", "#profile#"}, {"VariableCache", "Etat_Steph", true}, {"VariableCache", "Etat_Lise", true}, {"Sleep", 30, {"Profile", "NUIT"}}}, "Mode NUIT activé (par détection Jour/Nuit)")

    -- 5=FRIENDS
    GEA.add({{"VariableCache", "Jour_Nuit", "Jour"}, {"Or", {"VariableQuickApp", 190, "PRES_STEPHANE", true}, {"VariableQuickApp", 201, "PRES_LISE", true}}, {"VariableCache", "Prev_Profile", "FRIENDS"}}, 30, "", {"Profile", "FRIENDS"}, "Mode FRIENDS activé (par restauration mode précédent)")

    --8=MANUEL
    --à compléter


    -- *** Gestion des alarmes ***         
    GEA.add({"Profile", "HOME"}, -1, "", {{"SetDisarmed", {1,3,4}}, {"Portable", "26", "Mode HOME activé à #time# / Alarmes désactivées"}}, "Mode HOME activé / Alarmes désactivées")

    GEA.add({"Profile", "AWAY"}, -1, "", {{"SetArmed", {1,3,4}}, {"Portable", "26", "Mode AWAY activé à #time# / Alarmes activées :ext., garage & maison"}}, "Mode AWAY activé / Alarmes activées : Extérieur, Maison et Garage")

    GEA.add({"Profile", "NUIT"}, -1, "", {{"SetArmed", {1,3}}, {"Portable", "26", "Mode NUIT activé à #time# / Alarmes activées : ext. & garage"}}, "Mode NUIT activé / Alarmes activées : Extérieur et Garage")

    GEA.add({"Profile", "FRIENDS"}, -1, "", {{"SetDisarmed", {1,3,4}}, {"Portable", "26", "Mode FRIENDS activé à #time# / Alarmes désactivées"}}, "Mode FRIENDS activé / Alarmes désactivées")

    GEA.add({"Profile", "MANUEL"}, -1, "", {{"SetDisarmed", {1,3,4}}, {"Portable", "26", "Mode MANUEL activé à #time# / Alarmes désactivées"}}, "Mode MANUEL activé / Alarmes désactivées")

 

 
 
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci, c'est intéressant. J’utilisais une variable globale pour mémoriser le profil précédent, mais c'est plus élégant comme ça.

Partager ce message


Lien à poster
Partager sur d’autres sites

Comme la version 7.37 de la syntaxe n'a pas encore été publiée sur la première, j'en profite pour encore la modifier un tout petit peu.

 

Dans les modes thermostat possible j'ai rajouté Off car :

  • testé et ça fonctionne
  • ce mode est repris dans les exemples
-- "ThermostatMode" : Teste/modifie le mode de fonctionnement d'un thermostat

	-- SYNTAXE :
	{"ThermostatMode", <id_thermostat>, "<mode>"}
	-- mode : Heat | Cool | Auto | Resume | Fan | Dry | Off

	-- CONDITIONS :
	GEA.add( {"ThermostatMode", 72, "Heat"}, 30, "Thermostat chaud", {ACTIONS} ) -- Vérifie si le thermostat 72 est en train de chauffer
	GEA.add( {"ThermostatMode", 72, "Off"} , 30, "Thermostat arrêt", {ACTIONS} ) -- Vérifie si le thermostat 72 est arrêté

GEA v7.37 Syntaxe.lua

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir,

Est-ce que quelqu'un rencontre des pb avec la fonction Ask sous GEA?

GEA.add(true30"", {{"Ask"26"test notif inter""voulez-vous ouvrir ?", {"Close"3585}}, {"Repeat"}}, "test notification interactive")
 

Je reçois bien le message intercatif. Mais dès que je clique sur le "yes" (j'ai testé aussi avec le "no" au cas où !), je reçois une notif instantanément indiquant : "info: sending action "%@" failed" failed.

Je reçois également un email m'indiquant "suspicious login attempt" avec une adresse IP. J'ai vu sur le forum forum.fibaro.com que des personnes ont déjà rencontré ce pb sur des versions antérieures, mais je n'ai pas trouvé de solutions qui résoud le pb...

J'ai l'impression qu'il y a comme un filtrage et que la box ne veut pas accepter les messages entrant. Je suis en version 5.111.48 (beta).

Je précise que je n'ai aucun soucis avec les notifications push "classiques". J'ai également testé la notification interactive en mode bloc  et j'obtiens les mêmes soucis (donc a priori pas un pb lié à GEA)

Quelqu'un rencontre-t-il le même pb ? Un bug de la dernière version  ?

Merci pour vos réponses.

Partager ce message


Lien à poster
Partager sur d’autres sites

×