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 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
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 ».
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.
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 = "";
}
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é »
=> 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 :