Arreter, desactiver, et supprimer les cron d'un groupe de scenario

Bonjour à tous!
Je me permet de vous solicité car je ne trouve pas la possibilité de creer un scenario pour:

  • Arreter tout les scenarios d’un groupe
  • Desactiver tout les scenario d’un groupe
  • Supprimer les CRON associé de ces scenarios (car j’ai des programmation DANS/A)

J’ai fais des recherche mais je n’y arrive pas.
J’ai tester des codes PHP mais rien ne fonctionne:

$groupName = "Chauffage";
$scenarios = scenario::all();

foreach ($scenarios as $scenario) {
    if ($scenario->getGroup()->getName() == $groupName) {
        // Arrêter le scénario
        $scenario->stop();
        
        // Désactiver le scénario
        $scenario->setIsActive(0);
        $scenario->save();
        
        // Supprimer les cron associés au scénario
        $crons = cron::searchClassAndFunction('scenario', 'doIn', '{"scenario_id":'.$scenario->getId().'}');
        if (is_array($crons)) {
            foreach ($crons as $cron) {
                $cron->remove();
            }
        }
        
        $scenario->setLog("Arrêt et désactivation du scénario : " . $scenario->getName());
    }
}

De plus, je n’ai pas de retour de log, j’ai juste cela:

[2023-05-22 10:54:42][SCENARIO] -- Start : Scenario lance manuellement.
[2023-05-22 10:54:42][SCENARIO] - Exécution du sous-élément de type [action] : code
[2023-05-22 10:54:42][SCENARIO] Exécution d'un bloc code 
[2023-05-22 10:54:42][SCENARIO] - Exécution du sous-élément de type [action] : action
[2023-05-22 10:54:42][SCENARIO] Fin correcte du scénario

Alors que je souhaiterai avoir le resultat de chaque operation demandé dans le code. Es possible ?

Merci à tous!

Est ce que le scenario qui execute le vloc code a les logs activés ?

Sinon les logs mis dans le bloc code n’apparaîtront pas.

Les scenarios du groupe sont tous réglé sur « défaut »

Je ne parle pas des scenarios du groupe.

Tu dis ne pas avoir de logs.
Si tu ajoutes des ligs dans un bloc code php mais que le scenario qui execute ce blic code na pas les logs sur defaut tu n’en n’auras pas

Bonjour.

Je fais cela sans une ligne de code, avec le plugin « mode ».

Et le plugin mode est lui, piloté par un scénario qui va vérifier les conditions météorologiques « à venir » pour savoir s’il faut activer ou pas les scénarios de chauffage.

1 « J'aime »

Le problème semble être que tu utilises $scenario comme nom de ta variable qui est une variable déjà utilisée par le core. Essaye avec $monScenario ccomme nom de variable par exemple.

1 « J'aime »

Mais qui ne supprime aucune programmation des scenarios si jamais y en a…

Je viens de faire la modif suivante:

$groupName = "Chauffage";
$scenarios = scenario::all();

foreach ($scenarios as $monScenario) {
    if ($monScenario->getGroup() == $groupName) {
        // Arrêter le scénario
        $monScenario->stop();
        
        // Désactiver le scénario
        $monScenario->setIsActive(0);
        $monScenario->save();
        
        // Supprimer les cron associés au scénario
        $crons = cron::searchClassAndFunction('scenario', 'doIn', '{"scenario_id":'.$monScenario->getId().'}');
        if (is_array($crons)) {
            foreach ($crons as $cron) {
                $cron->remove_inat();
            }
        }
        
        $monScenario->setLog("Arrêt et désactivation du scénario : " . $monScenario->getName());
    }
}

Les scenarios se desactivent ! Youpi! Merci

Par contre je n’arrive pas a supprimer les cron liée à mon scenario « Programmation »
Comment dois je proceder ? Je pensais qu’en rajoutant remove_inat, cela enleverai tout les cron des scenarion du groupe visé. Ca n’a pas fonctionné

Ici, il faut mettre la variable réservée par le core…

https://community.jeedom.com/search?q=remove_inat%20%40Jeandhom

Et ben que dire de mieux! T’es trop fort.
J’en ai fait des recherches, meme avec le @remove_inat, et je ne suis pas tombé sur celui la!

Bon, j’ai modifié mon scenario, et tout fonctionne a merveille! Parfait
Je le garde bien au chaud maintenant, pour de futur autre scenario!

D’ailleurs, il faudrait que ce soit en natif sur le core cette fonction remove_inat

Merci

1 « J'aime »

Voila la solution grâce à vos retours:

$groupName = "Chauffage";
$scenarios = scenario::all();

foreach ($scenarios as $monScenario) {
    if ($monScenario->getGroup() == $groupName) {
        // Arrêter le scénario
        $monScenario->stop();
        
        // Désactiver le scénario
        $monScenario->setIsActive(0);
        $monScenario->save();
        
        // Supprimer les cron associés au scénario
        $crons = cron::searchClassAndFunction('scenario', 'doIn', '{"scenario_id":'.$monScenario->getId().'}');
        if (is_array($crons)) {
            foreach ($crons as $cron) {
                $cron->remove_inat();
            }
        }
        
        $monScenario->setLog("Arrêt et désactivation du scénario : " . $monScenario->getName());
    }
}

$scenarioName = "Programmation";
$scenarios = scenario::all();

foreach ($scenarios as $monScenario) {
    if ($monScenario->getName() == $scenarioName) {
        // Rechercher les cron associés au scénario
        $crons = cron::searchClassAndFunction('scenario', 'doIn', '"scenario_id":' . $monScenario->getId() . ',');
        if (is_array($crons)) {
            foreach ($crons as $cron) {
                if ($cron->getPID() == getmypid()) {
                    continue;
                }
                $cron->remove();
            }
        }
        
        $monScenario->setLog("Cron associés au scénario '" . $scenarioName . "' supprimés.");
    }
}

Si ca peut aider, il suffit juste de changer les noms de scenario ou equipement !
Merci @ tous

Ben c’est le cas !

Comment ça marche ?
Tu pourrais me faire un exemple de scénario avec remove_inat?
Merci

Salut,
Dans ce cas là supprime le bloc dans actif dans le scénario :

Le remove_inat doit être executé par le même scenario qui a fait la programmation A ou DANS.

En utilisant un tag il est donc tres facile d’appeler le scenario est supprimer sa ses programmations cron.

Oui je comprend.
Mais si seulement il existerait en natif la fonction remove_inat, ce serait plus simple pour des utilisateurs non expérimenté comme moi.

La fonction remove_inat devrait pouvoir être inséré dans un scénario et devrait ouvrir un champs de choix de scénario.
Au moins, de n’importe quel scénario, nous pourrions supprimer des cron liée a d’autre scénario, en natif, et très simplement …

Bonne journée :sunny:

:wink:

Mais c’est le cas, c’est ce que vous explique prfalken.

Seulement, dans le choix de fonction à utiliser, elle ne porte pas ce nom, mais :
Supprimer bloc DANS/A programmé
À sélectionner dans la liste déroulante des actions de scénario.
Qui se traduit automatiquement en remove_inat

Bonjour,
ça sera peut-être plus clair.
Voici se que sous entendait prfalken par

Coté scénario Appelant qui va demander l’arrêt / la suppression des bloc A & Dans / la désactivation d’un autre scénario « Appelé » :

Coté scénario Appelé (celui à désactiver) - (Il suffira de copier / coller le Si comme premier bloc des scénarios visés) :

Ceci étant,
si vous en avez plusieurs, peut-être êtes vous passé un peu vite sur la proposition de Fabrice, qui est très pertinente…

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.