Ce Forum passera en lecture seule en janvier 2020
Image
Merci de vous rendre sur https://community.jeedom.com maintenant pour vos prochains postes ;)

Lenteur Boucle

Réservé à la création de scénarios dans JEEDOM
Répondre
Kyoshi
Timide
Messages : 439
Inscription : 04 mai 2018, 14:05

Lenteur Boucle

Message par Kyoshi » 17 sept. 2019, 18:27

Hello,

Tout d'abord, une petite explication de la finalité de ce que je compte faire.
J'ai un écran Nextion, couplé à un Wemos.

J'utilise (ou plutôt vais utiliser) cet écran comme une sorte de Dashboard en version simplifié.
Parmi les fonctions que j'ai mis en place, se trouve les volets. Avec une image de volet. Enfin... plutôt 10 images de volets (palier d'ouverture par tranche de 10% histoire d'avoir un aperçu graphique de l'ouverture et de fermeture).

Donc lorsque j'appuie sur un bouton pour ouvrir ou fermer un volet, je souhaite voir graphiquement l'image du volet bouger.

Pour cela, j'ai un scénario qui envoie la bonne image en fonction du pourcentage d'ouverture du volet.
Je compte donc mettre en place une boucle qui, tant qu'un module volet est sollicité, chaque seconde, il m'envoie la mise à jour sur mon écran.

Pour le moment, j'ai effectué des essais en m'envoyant des messages.

Voici mon constat.

Ce scénario est lent :

Code : Tout sélectionner

  POUR #[Cuisine][Ilot][Puissance]# > 0  OU #[Cuisine][Baie vitrée][Puissance]# > 0 OU #[Cuisine][Evier][Puissance]# > 0  
    FAIRE
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"1","title":"Test","message":"test"}
     (sleep) Pause de  : 1
Je reçois deux messages pendant que je volet se ferme ou s'ouvre (alors que la fermeture prend bien plus que 2 ou 3 secondes).

Ceci fonctionne par contre bien :

Code : Tout sélectionner

  POUR #[Cuisine][Ilot][Puissance]# > 0  OU #[Cuisine][Baie vitrée][Puissance]# > 0 OU #[Cuisine][Evier][Puissance]# > 0  
    FAIRE
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"1","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
     (sleep) Pause de  : 1
     #[Maison][Pushover][Normale]# - Options : {"enable":"1","background":"0","title":"Test","message":"test"}
Ce qui veut dire que ce n’est pas la partie d’envoie de messages qui est longue mais l’entrée dans la boucle.

Il y a t'il possibilité d'accélérer la boucle?
Pourquoi une telle latence?

Merci d'avance.

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Lenteur Boucle

Message par Theduck38 » 17 sept. 2019, 19:45

Bonjour,

Tu pourrais faire une copie de ton premier scénario STP ? Je ne suis pas sûr que tu utilises la boucle dans son usage habituel...
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

Kyoshi
Timide
Messages : 439
Inscription : 04 mai 2018, 14:05

Re: Lenteur Boucle

Message par Kyoshi » 17 sept. 2019, 22:35

Theduck38 a écrit :
17 sept. 2019, 19:45
Bonjour,

Tu pourrais faire une copie de ton premier scénario STP ? Je ne suis pas sûr que tu utilises la boucle dans son usage habituel...
Hello,

Il n’y a rien d’autre pour le moment comme scénario.
Par la suite, au lieu d’envoyer un message (je ne suis qu’en phase de test), je ferais appel à un script (du plugin script).

Sur mon écran, dès que j’appuierais sur une fonction « volet », cela enverra un code que je récupère via le plugin ESPEasy et lancera le scénario (ça, ça fonctionne déjà).

La prochaine étape est de rajouter la visualisation de montée/descente. Pour cela comme dit, depuis le scénario que je tente de faire proprement, j’indiquerais (via le plugin script) quelle image affichée.

Pour savoir quand m'arrêter au niveau de ma boucle, je teste simplement quand il n’y a plus de puissance au niveau des modules (dans mon exemple du premier post, j’ai simplement pris en compte les volets de la cuisine).

Mais je n’ai pas d’autres scénarios par rapport au problème que je soulève.
Après, s’il y a une autre solution pour exécuter une commande toutes les secondes jusqu’à ce que aucun module ne dégage de la puissance... je suis preneur.

Avatar de l’utilisateur
PrFalKeN
Actif
Messages : 914
Inscription : 27 nov. 2017, 18:51

Re: Lenteur Boucle

Message par PrFalKeN » 18 sept. 2019, 07:37

'Jour,

le sleep de 1 a chaque fois cela ne ralenti pas ??
sans voir le scénario complet, dur dur d'aider !

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Lenteur Boucle

Message par Theduck38 » 18 sept. 2019, 09:31

En gros une boucle c'est de 1 à n ; n pouvant être la valeur d'une commande.
Ce n'est pas prévu -à ma connaissance- pour faire du "tant que".
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

Kyoshi
Timide
Messages : 439
Inscription : 04 mai 2018, 14:05

Re: Lenteur Boucle

Message par Kyoshi » 18 sept. 2019, 13:37

Hello,
PrFalKeN a écrit :
18 sept. 2019, 07:37
'Jour,

le sleep de 1 a chaque fois cela ne ralenti pas ??
sans voir le scénario complet, dur dur d'aider !
Mais c'est le scénario complet.
Je suis en phase de test et je n'ai rien d'autre.
Cela pose déjà un problème à ce moment.
J'ai copié/collé le scénario complet.

Sans le sleep, cela ne change rien.
Lors de l'ouverture d'un volet, sans le sleep, je ne reçois que deux notifications.

Theduck38 a écrit :
18 sept. 2019, 09:31
En gros une boucle c'est de 1 à n ; n pouvant être la valeur d'une commande.
Ce n'est pas prévu -à ma connaissance- pour faire du "tant que".
Mmhhh... Peut-être qu'il faut alors que je renvoie directement vers un script du plugin script et que je fasse une boucle while si ce n'est pas possible via un scénario

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Lenteur Boucle

Message par Theduck38 » 18 sept. 2019, 18:11

Tu pourrais le faire dans un bloc code PHP directement dans le scénario...
Le scénario va rester actif tant que le code sera en cours d'exécution (il va néanmoins falloir régler correctement le timeout du scénario pour éviter les blocages).
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

Kyoshi
Timide
Messages : 439
Inscription : 04 mai 2018, 14:05

Re: Lenteur Boucle

Message par Kyoshi » 21 sept. 2019, 14:08

Theduck38 a écrit :
18 sept. 2019, 18:11
Tu pourrais le faire dans un bloc code PHP directement dans le scénario...
Le scénario va rester actif tant que le code sera en cours d'exécution (il va néanmoins falloir régler correctement le timeout du scénario pour éviter les blocages).
Hello,

Voici ce que j'ai fait pour le moment (je prédise que je ne suis pas du tout développeur donc c'est peut-être cochonou et on peut certainement faire bien plus propre.

Scénario qui fait la boucle (qui se déclenche dès qu'une puissance dans un module change... Donc dès qu'un volet bouge en gros) :

Code : Tout sélectionner

$cmdCuisineIlot = cmd::byString("#[Cuisine][Ilot][Puissance]#");
$puissanceCuisineIlot = $cmdCuisineIlot->execCmd();
$cmdCuisineBaie = cmd::byString("#[Cuisine][Baie vitrée][Puissance]#");
$puissanceCuisineBaie = $cmdCuisineBaie->execCmd();
$cmdCuisineEvier = cmd::byString("#[Cuisine][Evier][Puissance]#");
$puissanceCuisineEvier = $cmdCuisineEvier->execCmd();
$cmdSamPanneauOuvrant = cmd::byString("#[Salle à manger][Panneau ouvrant][Puissance]#");
$puissanceSamPanneauOuvrant = $cmdSamPanneauOuvrant->execCmd();
$cmdSamPanneauFixe = cmd::byString("#[Salle à manger][Panneau fixe][Puissance]#");
$puissanceSamPanneauFixe = $cmdSamPanneauFixe->execCmd();
$cmdSalonCanape = cmd::byString("#[Salon][Canapé][Puissance]#");
$puissanceSalonCanape = $cmdSalonCanape->execCmd();
$cmdSalonBaie = cmd::byString("#[Salon][Baie][Puissance]#");
$puissanceSalonBaie = $cmdSalonBaie->execCmd();
$cmdPrenomFILS = cmd::byString("#[Chambre PrenomFILS][PrenomFILS][Puissance]#");
$puissancePrenomFILS = $cmdPrenomFILS->execCmd();
$cmdPrenomFILLE = cmd::byString("#[Chambre PrenomFILLE][PrenomFILLE][Puissance]#");
$puissancePrenomFILLE = $cmdPrenomFILLE->execCmd();
$cmdSdb = cmd::byString("#[Salle de bain haut][SdB][Puissance]#");
$puissanceSdb = $cmdSdb->execCmd();
$cmdParentsRoute = cmd::byString("#[Chambre Parents][Parents route][Puissance]#");
$puissanceParentsRoute = $cmdParentsRoute->execCmd();
$cmdParentsCote = cmd::byString("#[Chambre Parents][Parents côté][Puissance]#");
$puissanceParentsCote = $cmdParentsCote->execCmd();
$cmdSdjGauche = cmd::byString("#[Salle de jeux][SdJ gauche][Puissance]#");
$puissanceSdjGauche = $cmdSdjGauche->execCmd();
$cmdSdjMilieu = cmd::byString("#[Salle de jeux][SdJ milieu][Puissance]#");
$puissanceSdjMilieu = $cmdSdjMilieu->execCmd();
$cmdSdjDroite = cmd::byString("#[Salle de jeux][SdJ droite][Puissance]#");
$puissanceSdjDroite = $cmdSdjDroite->execCmd();
$cmdBureau = cmd::byString("#[Bureau][Bureau][Puissance]#");
$puissanceBureau = $cmdBureau->execCmd();

$starttime = time(true);
$timediff = 0;

while(($puissanceCuisineIlot > 1 || $puissanceCuisineBaie > 1 || $puissanceCuisineEvier > 1 || $puissanceSamPanneauOuvrant > 1 || $puissanceSamPanneauFixe > 1 || $puissanceSalonCanape > 1 || $puissanceSalonBaie > 1 || $puissancePrenomFILS > 1 || $puissancePrenomFILLE > 1 || $puissanceSdb > 1 || $puissanceParentsRoute > 1 || $puissanceParentsCote > 1 || $puissanceSdjGauche > 1 || $puissanceSdjMilieu > 1 || $puissanceSdjDroite > 1 || $puissanceBureau > 1) && $timediff < 300)
{
	$scenario = scenario::byId(54);
	$scenario->launch();
 	sleep(1);
    
	$puissanceCuisineIlot = $cmdCuisineIlot->execCmd();
 	$puissanceCuisineBaie = $cmdCuisineBaie->execCmd();
	$puissanceCuisineEvier = $cmdCuisineEvier->execCmd();
        $puissanceSamPanneauOuvrant = $cmdSamPanneauOuvrant->execCmd();
        $puissanceSamPanneauFixe = $cmdSamPanneauFixe->execCmd();
        $puissanceSalonCanape = $cmdSalonCanape->execCmd();
        $puissanceSalonBaie = $cmdSalonBaie->execCmd();
        $puissancePrenomFILS = $cmdPrenomFILS->execCmd();
        $puissancePrenomFILLE = $cmdPrenomFILLE->execCmd();
        $puissanceSdb = $cmdSdb->execCmd();
        $puissanceParentsRoute = $cmdParentsRoute->execCmd();
        $puissanceParentsCote = $cmdParentsCote->execCmd();
        $puissanceSdjGauche = $cmdSdjGauche->execCmd();
        $puissanceSdjMilieu = $cmdSdjMilieu->execCmd();
        $puissanceSdjDroite = $cmdSdjDroite->execCmd();
        $puissanceBureau = $cmdBureau->execCmd();
  
 
	$endtime = time(true);
	$timediff = $endtime - $starttime;
}

J'ai rajouté un timeout au cas où pour une raison inconnue, il ne sort pas de la boucle.
Cela m'était arrivé au début car certains modules reste au repos à 0,6W.

Si j'appelle un scénario qui m'envoie simplement un message via Pushbullet, aucun souci, je reçois bien chaque seconde un message jusqu'à ouverture/fermeture du volet.

Si j'appelle ce scénario (je teste avec un seul volet pour le moment) :

Code : Tout sélectionner

 SI #[Salle de jeux][SdJ gauche][Etat]# == 0  
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche0]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 0 ET #[Salle de jeux][SdJ gauche][Etat]# < 11
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche10]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 10 ET #[Salle de jeux][SdJ gauche][Etat]# < 21
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche20]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 20 ET #[Salle de jeux][SdJ gauche][Etat]# < 31
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche30]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 30 ET #[Salle de jeux][SdJ gauche][Etat]# < 41
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche40]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 40 ET #[Salle de jeux][SdJ gauche][Etat]# < 51
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche50]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 50 ET #[Salle de jeux][SdJ gauche][Etat]# < 61
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche60]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 60 ET #[Salle de jeux][SdJ gauche][Etat]# < 71
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche70]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 70 ET #[Salle de jeux][SdJ gauche][Etat]# < 81
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche80]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 80 ET #[Salle de jeux][SdJ gauche][Etat]# < 91
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche90]# - Options : {"enable":"1","background":"1"}
    SINON
    
    SI #[Salle de jeux][SdJ gauche][Etat]# > 90
    ALORS
     #[Mobile et software][Script_MAJ_Nextion_Volets][sdjgauche99]# - Options : {"enable":"1","background":"1"}
    SINON

Les différents script qui sont appelés changent l'image du volet sur mon écran Nextion via un script HTTP. Exemple :

Code : Tout sélectionner

http://IP_du_WEMOS/control?cmd=NEXTION,p40.pic=20
Sauf qu'il ne me change que l'image du volet au début, lorsque j'appuie sur bouton.
Le scénario juste au dessus ne s'exécute qu'une seule fois au lieu de chaque seconde.
Si je met un sleep(5), cela ne change rien.

Une idée du pourquoi?

Et autre question... Puis-je envoyer une requête HTTP directement dans mon premier code?
Ce serait peut-être plus simple.

J'ai un peu regardé sur le net... Via une méthode POST?
J'ai essayé plusieurs trucs mais sans succès.

Kyoshi
Timide
Messages : 439
Inscription : 04 mai 2018, 14:05

Re: Lenteur Boucle

Message par Kyoshi » 21 sept. 2019, 15:35

Je viens de rajouter le lancement du scénario après la boucle histoire d'avoir le retour une fois que tous volets ne bougent plus.
Mais je n'ai quand même pas de retour visuel pendant l'ouverture ou la fermeture.

Kyoshi
Timide
Messages : 439
Inscription : 04 mai 2018, 14:05

Re: Lenteur Boucle

Message par Kyoshi » 21 sept. 2019, 15:41

Bon, je me réponds à moi-même...
Il est normal que cela ne fonctionne pas car la MAJ de l'état du volet ne se fait pas pendant que le volet fonctionne.

Répondre

Revenir vers « Scénarios »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités