Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

[Ex] Contrôle dynamique du CRON

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3882
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

[Ex] Contrôle dynamique du CRON

Message par Sshafi » 23 nov. 2016, 14:14

Contrôler dynamiquement le CRON d'un scénario X depuis un scénario Y.
La limitation de Jeedom qui motive ce post est la suivante :
Comme vous devez le savoir, aujourd'hui, un scénario Jeedom ne peut être planifié que de façon statique.
Il n'est ainsi pas possible de mettre une variable dans le CRON, pour modifier l'heure d'exécution.
Par exemple, avec le CRON, vous pouvez planifier un scénario pour qu'il s'exécute tous les jours à une heure fixe. Mais si cette heure varie, (comme un lever ou un coucher de soleil), vous ne pourrez pas le faire "proprement".
Je dis "proprement" car de nombreux jeedomiens ont contourné cette limitation en déclenchant le scénario à heure fixe, puis en ajoutant des conditions de type "Sleep" ou autre dans les blocs action. Cela n'est absolument pas optimisé d'un point de vue performance (pour le sleep) et pas vraiment logique non plus.
De plus, ces solutions de contournement ne peuvent que retarder l'exécution d'un scénario, mais pas l'avancer. Par exemple, j'ai lu un post d'un Jeedomien souhaitant déclencher un scénario X mn avant le lever du soleil. Alors oui, vous me direz qu'il suffit alors de modifier l'heure de déclenchement statique du scénario et de garder la logique des sleeps à tout va dedans. En effet. Mais au détriment des perfs de votre système .... (sans parler de la logique de contournement discutable).
En ce qui me concerne, je n'utilise jamais de sleep pour ce genre de cas et préfère plutôt contrôler dynamiquement les heures de planification. C'est ce que je vais vous montrer.

Le Principe de fonctionnement du "contrôle dynamique" du CRON

En fait, tout réside dans 1 scénario central ayant 2 rôles :
  • effectuer des opérations (transformation de date, manipulation de chaînes, ...)
  • planifier les scénarios exécutant des actions
Ce scénario central ne contient qu'un bloc de type "Code". (Et oui, avec Jeedom, il n'y a souvent pas d'autres moyens de faire propre que de passer par du Code. Mais ça ouvre bien d'autres possibilités ensuite .... )

Dans l'exemple que je décris ci-dessous, j'ai utilisé 2 besoins concret :
  • comment déclencher un scénario X mn APRES le lever du soleil ?
  • comment déclencher un scénario X mn AVANT le lever du soleil ?
Configuration du scénario Central

Dans mon exemple, ce scénario s'appelle "Test Control Planif" et il est de type "programmé" avec un cron à "0 5 * * *" (tous les jours 5h du matin, modifiable à souhait).
Il ne contient qu'un seul bloc, de type "Code".

[img]939792scnariocontrleCRON.png[/img]

Le Code
Voici le code à copier/coller si vous voulez tester également:

Code : Tout sélectionner

   // ******************************************************************
   // variables et paramètres globaux : à adapter en fonction de chacun
   // ******************************************************************
   //
   // Coucher du soleil
   $PluginMeteoSunsetCMD = '#[Terrain][Météo][Coucher du soleil]#'; // à adapter en fonction du nom du plugin Météo
   $SunsetDelta = '- 30 minute' ; // à adapter en fonction du décalage que l'on souhaite (+ ou - X mn)
   $SunsetScenarioID = '19'; // à adapter en fonction de l'ID du scénario "Coucher de soleil"
   //
   //
   // Lever du soleil
   $PluginMeteoSunriseCMD = '#[Terrain][Météo][Lever du soleil]#'; // à adapter en fonction du nom du plugin Météo
   $SunriseDelta = '+ 30 minute' ; // à adapter en fonction du décalage que l'on souhaite (+ ou - X mn)
   $SunriseScenarioID = '21'; // à adapter en fonction de l'ID du scénario "Lever de soleil"
   //
   // **********************************************************
   // 1ère partie : transformation des dates
   // **********************************************************
   //
   // ===============================
   // COUCHER DU SOLEIL
   // ===============================
   //
   // variables locales
   $Delta = $SunsetDelta ;
   $CMD = $PluginMeteoSunsetCMD ;
   //
   // transformation
   $SunCmd = cmd::byString($CMD);
   if (is_object($SunCmd)) {
      $MySun = date("g:i a", strtotime($Delta, strtotime($SunCmd->execCmd()))) ;
   //
   // affectation valeur finale
        $MySunset = $MySun ;
   } 
   //
   //
   // ===============================
   // LEVER DU SOLEIL
   // ===============================
   //
   // variables locales
   $Delta = $SunriseDelta ;
   $CMD = $PluginMeteoSunriseCMD ;
   //
   // transformation
   $SunCmd = cmd::byString($CMD);
   if (is_object($SunCmd)) {
        if (intval($SunCmd->execCmd()) < 1000) { 
         $MySun = date("g:i a", strtotime($Delta, strtotime('0' . $SunCmd->execCmd()))) ;
       } 
      else { 
         $MySun = date("g:i a", strtotime($Delta, strtotime($SunCmd->execCmd()))) ;
       }     
   //
   // affectation valeur finale
        $MySunrise = $MySun ;
   } 
   //
   //
   //
   //********************************************************
   // 2ème partie: contrôle de la planification des scénarios
   //********************************************************
   //
   // ===============================
   // scénario COUCHER DU SOLEIL
   // ===============================
   //
   // variables locales
   $MyDate = strtotime($MySunset) ;
   $ScenarioID = $SunsetScenarioID ;
   //
   // modification planification
   $Scenario = scenario::byId($ScenarioID);
   if (is_object($Scenario)) {
        if ($Scenario->getMode() != 'schedule') {
         $Scenario->setMode('schedule') ;
      }
      $Schedule = $Scenario->getSchedule() ;
      $Scenario->setSchedule(date('i', $MyDate) . ' ' . date('H', $MyDate) . ' ' . date('d', $MyDate) . ' ' . date('m', $MyDate) . ' * ');
       $Scenario->save();
   }
   //
   // ===============================
   // scénario LEVER DU SOLEIL
   // ===============================
   //
   // variables locales
   $MyDate = strtotime($MySunrise) ;
   $ScenarioID = $SunriseScenarioID ;
   //
   // modification planification
   $Scenario = scenario::byId($ScenarioID);
   if (is_object($Scenario)) {
        if ($Scenario->getMode() != 'schedule') {
         $Scenario->setMode('schedule') ;
      }
      $Schedule = $Scenario->getSchedule() ;
      $Scenario->setSchedule(date('i', $MyDate) . ' ' . date('H', $MyDate) . ' ' . date('d', $MyDate) . ' ' . date('m', $MyDate) . ' * ');
       $Scenario->save();
   }
Remarque sur le code

Si vous voulez tester ce code chez vous, il vous suffit de simplement modifier les lignes 5 à 13 avec vos propres paramètres:
  • le nom de votre plugin météo
  • le nombre de minute à ajouter ou à soustraire par rapport à l'heure de lever et de coucher de soleil
  • l'ID de vos scénarios "coucher du soleil" et "lever du soleil" (ce sont ces scénarios qui exécutent réellement vos actions. Comme ouvrir les volets ou monter la température d'un radiateur)
(Le code est en partie commenté, ce qui devrait je l'espère vous permettre de vous y retrouver facilement)
Ce code se base sur le plugin Météo et transforme les valeurs récupérées par les commandes "Lever du soleil" et "Coucher du soleil". (Bien entendu, vous pouvez l'adapter et utiliser n'importe quelle autre source de donnée ).

Utilisation de ce scénario de contrôle

Comme le scénario est de type "programmé", il n'y a rien à faire. Il s'exécutera 1 fois par jour le matin, récupérera les informations requises (heure du lever et du coucher de soleil), les transformera, et ira automatiquement planifier les autres scénarios.

Vous pouvez parfaitement planifier ce scénario plusieurs fois par jour, ou encore mieux, adapter légèrement mon code pour lui faire "s'auto planifier" à des moments intelligemment choisis (par exemple basé sur des données historiques, ou sur des capteurs externes, .... ).

Conclusion

Voici un simple exemple qui n'a d'autre but que de vous montrer qu'il n'est pas très compliqué de modifier les CRON de nos scénarios (à peine 6 lignes de code pour le contrôle des CRON) et que vous pouvez parfaitement supprimer l'utilisation massive des sleeps.

Article originaire de : trankil
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

Verrouillé

Revenir vers « Scénarios »

Qui est en ligne ?

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