Lancer un scénario toutes les n secondes (boucle infinie)

Bonjour à tous,

Les entrées analogiques de mon IPX800v3 ne disposent pas de push sortant. Je les interroge en lançant un scénario toutes les minutes (via cron).

J’aimerais plus de réactivité, donc lancer le scénario toutes les 10s, 5s voire 2s (selon la charge sur IPX800 et Jeedom).

J’ai tenté ça, mais le scénario ne se lance qu’une seule fois :

  
    ACTION
     remove_inat - Options : {"enable":"1","background":"0"}
     message - Options : {"enable":"1","background":"0","message":"D\u00e9clenchement : date(s) sec."}
     (sleep) Pause de  : 5
     (scenario) start de [Aucun][Aucun][scLectureAnalogiqueSecondes]

Comment faire une boucle infinie type while =1 ?

Merci.

Salut,

Je ne suis pas certain que Jeedom soit tellement conçu pour cela, même si dans l’absolu ça doit pouvoir marcher, tu es quand même en limite pour un système domotique.

Oui, je pense pas que tu puisses faire comme ça, de plus je comprends pas pourquoi tu fais un remove_inat ?

Techniquement tu dois pouvoir faire ça via un bloc code et le faire directement en php.

Cependant je suis pas certain que ce soit tellement judicieux, perso je ferais plutot par exemple de la façon suivante en partant sur l’hypothèse que tu check toutes les 5s :

Une programmation fixe toutes les heures.
Une boucle de 1 à 719
Dans la boucle ton action d’interrogation
Un sleep 5s

A ajuster et à surveiller bien sur. Voir si tu ne prends pas trop de « retard » sur 1h.

Et en fonction du hardware sur lequel se trouve ton système, si par exemple c’est une carte SD qui va pas aimer les écritures incessantes, désactiver les logs du scénario et ne logger de ton coté que si il y a des choses interessantes.

Cela se limite à un seul scénario. Je souhaite tenter car Jeedom est sur un serveur Proxmox → beaucoup de CPU, de RAM, et SSD endurant.

Dans mes essais j’avais coché multi-lancements et le scénario ne s’arrêtait plus. J’ai été obligé de redémarrer pour le supprimer. J’ai décoché multi-lancement, donc je vais retirer cette ligne.

Pourquoi déconseilles-tu cette façon de faire ?

OK, je vais tester l’idée en attendant de trouver une « vraie » boucle infinie.

SSD endurant, donc pas de SD fragile ici. Mais tu fais bien de rappeler le risque !
Merci pour tes retours !

Pour ceux qui sauraient, je reste preneur de comment faire une boucle infinie.

Car je ne suis pas sur que jeedom soit réellement conçu pour avoir des scénarios qui ne s’arrêtent jamais. Mais bon peut etre à tester …

Et aussi pour savoir ce qui lance ta boucle. Dans le cas d’une vraie boucle infinie, tu pourrais avoir un scéanrio qui à pour déclencheur le démarrage de jeedom. Mais si pour X raison ta boucle se plante ou s’arrete, il faudra que tu puisses la redémarrer … C’est pas infaisable mais bon je trouvais plus simple avoir un scénario qui dure 1h et se relance toutes les heures.

Après rien ne t’empêche via un bloc code de faire un while hein. C’est juste que je n’ai jamais testé et je ne sais pas comment jeedom va se comporter !

1 « J'aime »

Bonjour à tous,

voici un code à mettre dans un bloc « Code » d’un scénario.
C’est ce scénario qui lancera « #[Aucun][Aucun][scLectureAnalogiqueSecondes]# » toutes les X secondes.

$pauseEnSecondes = 5;
$scLectureAnalogiqueSecondes = scenario::byString("#[Aucun][Aucun][scLectureAnalogiqueSecondes]#") ;

while (1) {
    // Cette boucle s'active toutes les "$pauseEnSecondes"
    // A toi d'y mettre le code PHP que tu veux.
     
    
    if($scLectureAnalogiqueSecondes->running() == false) { // si le scénario n'est pas en cours
        $scLectureAnalogiqueSecondes->launch();            // Lancement du scénario
      }
    
    // Attend X seconde avant la prochaine verification (1000000 microsecondes = 1 seconde)
    usleep($pauseEnSecondes * 1000000); 
}

J’ai pris le mien et j’ai adapté pour ton besoin (si j’ai bien compris)

Attention avec while(1) ca fait un boucle infini donc tu peux l’arrêter seulement à la main (bouton arreter du scenario)

Les boucles infini c’est dangereux si tu mets une mauvaise tempo ca sature la mémoire et faut redémarrer.

Donc ne pas le lancer automatiquement au démarrage de Jeedom tant que tu ne l’as pas tester et qu’il marche correctement

Top je vais tester ça ! Merci @c.miorin

Pris en compte !

Tiens moi au courant :wink:

Perso j’aurais fait les actions directement dans la boucle plutôt que de se servir de la boucle pour lancer le scénario qui va faire l’action.

Même si au final ça revient au même ça va sans doute mettre à jour beaucoup plus de trucs coté jeedom (date de dernière exécution du scénario, le fait qu’il soit en cours ou non …) de façon hyper fréquente pour pas grand chose.

1 « J'aime »

Ca permet de se servir de cette boucle pour lancer plusieurs scénario si besoin… C’est plus lisible.
Et certaine actions sont plus facile à mettre en place dans un autre scénario que de tout faire en PHP

Autrement tu as raison on peut faire ca.

Bien entendu :hugs:

Avant de tester le bloc code, petit souci avec le scénario précédent…

Il n’est plus actif :

Il apparait en erreur :

Et pourtant mon design se rafraichit toutes les 3 secondes…
Donc le scénario tourne encore en mémoire.

Comment l’identifier et le « killer » svp ?

Oui je suis d’accord sur le coté réutilisation du code, mais au vu du truc ultra spécifique, perso je n’essaierai pas de factoriser ça :slight_smile:

Tu as accès en ssh à ton jeedom ?

Si oui fais un : ps -ax | grep jeeScenario.php

Tu récupère le pid correspondant et tu le kill

1 « J'aime »

Dans l’absolue tu le désactives et tu redémarres.

Par contre il faut plus mettre de pause ou de boucle dans ton scénario [Aucun][Aucun][scLectureAnalogiqueSecondes].

Et en effet comme le dit @Aurel évite l’enchainement de scénario qui lance des scénario.

Rassurez-vous, cela se limite à UN scénario.
(Lecture des puissances remontées par des pinces ampèremétriques GCE sur XC400-CT).

Tans que tu as compris le code PHP que j’ai transmis tu sauras t’adapter. :fire:

1 « J'aime »

La page de @kiboost m’as grandement aidé :

Oui je suis connecté en ssh. Par contre cela n’a pas fonctionné à cause d’un pid différent.
J’ai pensé à un manque de rapidité de ma part (lecture pid puis commande kill).
J’ai donc fait un script → pas mieux

script

Pour comprendre, j’ai saisi n fois la commande (à la volée), je vois que le pid change systématiquement :
allpids

Au lieu de rester identique durant 3 secondes. Ou alors il y a X scénarios qui tournent en mémoire, mais ps devrait l’afficher… J’ai loupé un truc ?

Oui, je ne garderai que le bloc code, donc plus d’autres pauses.

Au pire je fais comme dit @c.miorin , je désactive et je redémarre.

+1 pour la page de @kiboost :+1:

[EDIT] Cette fois le scénario est arrêté. Je teste le bloc code ce soir. A suivre.

Pour info, ce que tu vois qui change de PID c’est juste la commande que tu vient de lancer.

Donc a chaque fois le PID change, c’est juste ta propre commande que tu voit en résultat ( je crois…).

1 « J'aime »

Sauvegarde avant, récupère la sauvegarde, désactive le scénario et redémarre