Rapport watchdog & ChatGPT

Bonjour à tous,

Ca fait un moment que j’aimerais que Watchdog en plus des alertes, puisse m’envoyer à intervalle régulier un rapport (parce que si on est pris au moment de l’alerte c’est un coup à l’oublier derrière). Mais comme je suis une grosse feignasse assumée :slight_smile: et que je voulais expérimenter… J’ai demandé de l’aide, a ChatGPT

Je vous livre le résultat, alors il y a eu bien sûr un peu de prompt engineering et j’aurais sûrement passé moins de temps à le faire moi-même (quoique, vues mes compétences en PHP…) mais c’est quand même totalement bluffant, bien entendu c’est fonctionnel (testé et approuvé) et mis en production chez moi :slight_smile:

1. Dans Jeedom, allez dans le menu « Scénarios ».
2. Cliquez sur le bouton « + » pour créer un nouveau scénario.
3. Donnez un nom à votre scénario, par exemple « Rapport quotidien Watchdog ».
4. Dans l’onglet « Scénario », ajoutez un bloc « Code » en cliquant sur « Ajouter » puis « Code ».
5. Copiez et collez le code suivant dans le bloc « Code » :

// Récupérez tous les équipements de type "Watchdog"
$equipementsWatchdog = eqLogic::byType('Watchdog');

// Générez le rapport avec les pastilles vertes et rouges pour chaque contrôle inversé dans un tableau HTML
$rapport = "<table border='1' cellpadding='5' cellspacing='0'>";
$rapport .= "<tr><th>Pastille</th><th>Contrôle</th><th>État</th></tr>";
$greenImg = 'https://i.imgur.com/1zHTojw.png'; // URL d'une pastille verte en ligne
$redImg = 'https://i.imgur.com/pc2e1L7.png'; // URL d'une pastille rouge en ligne
foreach ($equipementsWatchdog as $equipement) {
    $cmds = $equipement->getCmd('info');
    foreach ($cmds as $cmd) {
        // Récupérez la valeur de "resultat" à partir de la configuration de la commande
        $config = $cmd->getConfiguration();
        $etatStr = $config['resultat'];
        $nom = $cmd->getName();

        // Convertissez la chaîne "True" ou "False" en un booléen
        $etat = ($etatStr === "True") ? 1 : 0;

        $pastille = ($etat == 0) ? "<img src='$greenImg' alt='OK'>" : "<img src='$redImg' alt='KO'>"; // Inversez la condition ici
        $ligne = "<tr><td>" . $pastille . "</td><td>" . $nom . "</td><td>" . ($etat == 0 ? 'OK' : 'KO') . "</td></tr>"; // Inversez la condition ici

        $rapport .= $ligne;
    }
}
$rapport .= "</table>";

$scenario->setData("rapport", $rapport);

// Générez la variable $title avec le titre de l'e-mail
$title = "Rapport quotidien des équipements Watchdog - " . date("Y-m-d");

// Rendez la variable $title disponible en dehors du bloc code
$scenario->setData("title", $title);

6. Enregistrez le scénario en cliquant sur le bouton « Sauvegarder ».
7. Ajoutez un bloc « Action » en cliquant sur « Ajouter » puis « Action ».
8. Dans le bloc « Action », sélectionnez la commande « Envoyer un mail » de votre équipement « Mail Test ».
9. Dans le champ « Titre », entrez variable(title) pour utiliser la variable $title générée par le bloc « Code ».
10. Dans le champ « Message », entrez variable(rapport) pour utiliser la variable $rapport générée par le bloc « Code ».
11. Enregistrez le scénario en cliquant sur le bouton « Sauvegarder ».
12. Dans l’onglet « Programmation », configurez le scénario pour qu’il s’exécute tous les matins à l’heure souhaitée. Par exemple, pour le programmer tous les jours à 8h00, entrez 00 8 * * * dans le champ « Programmation ».
13. Activez le scénario en cochant la case « Activer » en haut à droite, puis cliquez sur « Sauvegarder ».

Le scénario est maintenant configuré pour envoyer un e-mail quotidien avec l’état des équipements Watchdog et les pastilles vertes et rouges pour chaque contrôle. Les e-mails seront envoyés à l’adresse e-mail définie dans votre équipement « Mail Test ».

3 « J'aime »

Suite a une demande sur le discord de JeeMate voici le bloc code modifié pour être utilisable en notif JeeMate.

$cmdId = "876662"; // remplacer par l'id de la commande notification souhaitée.
$message = ""; // ne pas toucher.
$title = "Rapport quotidien des équipements Watchdog - " . date("Y-m-d"); // Motifier suivant le titre voulu.

$cmdNotif = cmd::byId($cmdId);

$eqLogics = eqLogic::byType('watchdog'); // Récupérez tous les équipements de type "Watchdog".

foreach ($eqLogics as $eqLogic) {
    $cmds = $eqLogic->getCmd('info');
  	$eqLogicName = $eqLogic->getName();
  	$message .= "Rapport pour l'équipement : <strong>" . $eqLogicName . "</strong><br>";
    foreach ($cmds as $cmd) {
        $etat = $cmd->getConfiguration()['resultat'];
        $nom = $cmd->getName();

        $pastille = ($etat == "True") ? "\u{1F535}" : "\u{1F534}"; // on affiche une pastille verte ou rouge suivant l'etat.
      	$isOk = ($etat == "True") ? '<strong>OK</strong>' : '<strong>KO</strong>'; // on affiche OK ou KO en gras suivant l'etat.
      
        $ligne = $pastille . " -> " . $nom . " - " . $isOk . "<br>"; // on crée une ligne pour chaque equipement
      
        $message .= $ligne;
    }
          $message .= "<br>";
}

$options = array('title'=>$title, 'message'=> $message);
$cmdNotif->execCmd($options);

Il y a juste besoin de :
Déclencheur : cron journalier
Scénario : modifier dans le bloc code l’id de la commande notification et si souhaité le titre. Rien de plus.

Pas besoin de commande action tout est fait par le bloc code.

2 « J'aime »

Bonjour,

Je me permet d’apporter ma pierre à l’édifice :

J’ai adapté le script proposé ci-dessus pour Discord. Il s’appuie sur le plugin plugin-discordlink pour envoyer les notifications.
DiscordLink n’étant capable d’envoyer un rapport que de 2000 caractères, j’ai découper 1 équipement WatchDog = 1 envoi.
J’ai utilisé la commande « Envoi message évolué » pour avoir un rendu plus sympa.
j’ai également fait disparaitre la ligne « Résultat Global » qui apparraissait à chaque fois en KO (car je n’utilise pas cette fonction dans mes WatchDog :


)

Et dernier point ; j’ai personnalisé le liseret de couleur envoyé sur Discord pour que si 1 test dans la liste est KO ; alors la couleur est rouge ; sinon, elle est verte.
Voici le code :

$cmdId = "33416"; // remplacer par l'id de la commande notification souhaitée.
$message = ""; // ne pas toucher.
$title = "Rapport quotidien des équipements Watchdog - " . date("Y-m-d"); // Motifier suivant le titre voulu.

$cmdNotif = cmd::byId($cmdId);

$eqLogics = eqLogic::byType('watchdog'); // Récupérez tous les équipements de type "Watchdog".

foreach ($eqLogics as $eqLogic) {
    $color = "#78B159"; // Couleur verte par defaut
    $cmds = $eqLogic->getCmd('info');
  	$eqLogicName = $eqLogic->getName();
  	$message .= "Rapport pour l'équipement : **" . $eqLogicName . "**
    ";
    foreach ($cmds as $cmd) {
        $etat = $cmd->getConfiguration()['resultat'];
        $nom = $cmd->getName();
        if ($nom == "Résultat Global") { ; } else { // On ignore la commande 'Résultat Global' pour chaque rapport
        $pastille = ($etat == "True") ? ":green_circle:" : "\u{1F534}"; // on affiche une pastille verte ou rouge suivant l'etat.
      	$isOk = ($etat == "True") ? '**OK**' : '**KO**'; // on affiche OK ou KO en gras suivant l'etat.  
        $ligne = $pastille . " -> " . $nom . " - " . $isOk . "
        "; // on crée une ligne pour chaque equipement
        $message .= $ligne;
        if ($isOk == '**KO**') { $color = "#DD2E44";
        }
        } 
    }
    $message .= "";
    $footer = "Rapport watchdog";
	$options = array('title'=>$title, 'description'=> $message, 'footer'=> $footer, 'colors'=> $color);
    $cmdNotif->execCmd($options);
    $message = "";
}

Voici le rendu sur Discord :

Etant un novice accompli de php, je suis à l’écoute de toute amélioration du code, ou du rendu du rapport ! :slight_smile:

Merci beaucoup (et merci @Isilorn pour avoir lancé l’idée).
Je cherchais exactement à faire ça avec Watchdog sans avoir le résultat escompté. Ce petit scénario clé en main est au top du top !

Deux remarques :

$cmdId = "33416"; // remplacer par l'id de la commande notification souhaitée.

=> Pour ceux pour qui ce n’est pas vraiment limpide (moi le premier :)), il suffit d’aller dans le module Discord Link, le canal que vous souhaitez utiliser, onglet Commande et de récupérer l’ID de la ligne « Envoi message évolué »

 $pastille = ($etat == "True") ? ":green_circle:" : "\u{1F534}"; 

=> Ici si on met : green_circle :, Discord l’interprète bien mais pas la notif sur l’accueil du téléphone qui visiblement attend de l’unicode. J’ai remplacé par :

 $pastille = ($etat == "True") ? "\u{1F7E2}" : "\u{1F534}"; 

Et là la pastille verte s’affiche correctement sur la notification également.

Bonne journée les jeedomiens!