[TUTO] Recevoir une notification Telegram regroupant les états des démons

Tutoriel pour lister l’etat des daemons sous forme d’une notification Telegram, agrémentée d’émoticônes.

Prérequis :

  • Plugin Telegram fonctionnel
  • Plugin Jeelink installé afin d’avoir la remontée de l’état de chaque équipement

Tout d’abord, il faut créer deux variables :

  • « IconOK » avec la valeur « &#127383 » qui correspond à l’émoticone « OK » en valeur décimale
  • « IconKO » avec la valeur « &#127384 » qui correspond à l’émoticône « SOS » en valeur décimale

Ensuite, créer un nouveau scénario, puis ajouter un bloc « Code »

Puis ajouter les lignes suivantes :

// On efface la variable message
$message='';
// on indique la liste des demons à verifier
$ListeDaemons = array('Caméra','ESPeasy','Homebridge','RfPlayer','RfPlayer2','SMS','Xiaomi Home','Z-Wave');
// on capture la liste de tous les équipements
$ListeEquipements = eqLogic::all();
// on ajoute une ligne dans le log
$scenario->setLog('Début Monitoring des Demons');
// pour chaque equipement dans la liste complete des equipements
foreach($ListeEquipements as $Equipement)
{
  
  // pour chaque entree dans la liste des demons renseignée plus haut
  for ($i = 0; $i < count($ListeDaemons); $i++) 
  {
 
        try
    {
     // on recupere le chemin de l'equipement recherché : #[Maison][jeelink][Démon XXX]#
    $cmd = cmd::byString('#' . $Equipement->getHumanName() . '[Démon '.$ListeDaemons[$i].']#');
      
    // on recupere la valeur de l'équipement  et on stocke dans $ValeurDaemon (soit 0 ou 1) 
    $ValeurDaemon = $cmd->execCmd();

    // on ajoute dans le log " Daemon XXX - 0" (ou 1)
    $scenario->setLog( 'Daemon '.$ListeDaemons[$i].' - '.$ValeurDaemon);
    
    // si le daemon est a 1, on veut faire afficher l'emoticon OK stockée au préalable dans la variable core "IconOK"
    // sous une valeur décimale
      
    // si Daemon ok (=1)  
    if($ValeurDaemon == '1')
                     {
                         // Récupère la valeur de la variable core "IconOK"
                         $valeur=$scenario->getData('IconOK');
     }
    
    // si Daemon ok (=0)  
     if($ValeurDaemon == '0')
                     {
                         // Récupère la valeur de la variable core "IconKO"
                         $valeur=$scenario->getData('IconKO');
     }
      
      // on ajoute le texte "|Démon XXX - EmoticonOK/KO" (le | permet de distinguer le retour a la ligne
    $message=$message.'|Daemon '.$ListeDaemons[$i].' - '.$valeur;
      
  }catch (Exception $e)
  {
  }
    
  } 
}      

// on remplace tous les | par un retour à la ligne (\n) dans la variable message
$message=str_replace("|","\n",$message);
// on selectionne la commande telegram correspondante au destinataire du message
$cmd=cmd::byString('#[Maison][Telegram][Utilisateur_Destinataire]#');
// on envoie le contenu de la variable message via telegram
$cmd->execCmd($options=array('title'=>'Jeedom', 'message'=> "$message"), $cache=0);
// on log la fin de la verification des démons
$scenario->setLog( 'Fin monitoring des démons');

2eme version plus compacte

Cette version indique si tout est OK et combien de daemons sont ok.
Si un demon est KO, son nom sera listé juste en dessous.

// On efface la variable $message
$message='';

// RAZ des variables Compteurs
$NbDaemonsOK="0";
$NbDaemonsKO="0";

// on cree un tableau vide pour y ajouter la liste des daemons KO 
$ListeDaemonKO = array();

// on indique la liste des demons à verifier
$ListeDaemons = array('Caméra','ESPeasy','Homebridge','RfPlayer','RfPlayer2','SMS','Xiaomi Home','Z-Wave');

// on capture la liste des équiepents
$ListeEquipements = eqLogic::all();

// on ajoute une ligne dans le log
$scenario->setLog('Début Monitoring des Demons');
// pour chaque equipement dans la liste complete des equipements
foreach($ListeEquipements as $Equipement)
{
  
  // pour chaque entree dans la liste des demons renseignée plus haut
  for ($i = 0; $i < count($ListeDaemons); $i++) 
  {
 
  
    try
    {
     // on recupere le chemin de l'equipement recherché : #[Maison][jeelink][Démon XXX]#
    $cmd = cmd::byString('#' . $Equipement->getHumanName() . '[Démon '.$ListeDaemons[$i].']#');
      
    // on recupere la valeur de l'équipement  et on stocke dans $ValeurDaemon (soit 0 ou 1) 
    $ValeurDaemon = $cmd->execCmd();

    // on ajoute dans le log " Daemon XXX - 0" (ou 1)
    $scenario->setLog( 'Daemon '.$ListeDaemons[$i].' - '.$ValeurDaemon);
      
    // si Daemon ok (=1)  
    if($ValeurDaemon == '1')
                     {
                        // on incremente le nombre de daemons OK
      					$NbDaemonsOK++;
     }
    
    // si Daemon ok (=0)  
     if($ValeurDaemon == '0')
                     {
                        // on incremente le nombre de daemons KO
       					$NbDaemonsKO++;
       					array_push($ListeDaemonKO, "$ListeDaemons[$i]");
     }
      
   
  }catch (Exception $e)
  {
  }
    
  } 
}      
// si $ListeDaemonKO est vide  
if (empty($ListeDaemonKO)) {
  // recuperation du code de l'emoticone OK
  $Emoticon=$scenario->getData('IconOK');
  $scenario->setLog('Etat des démons : OK ('.count($ListeDaemons).')');
  $message='<b><u>Etat des démons :</u></b> '.$Emoticon.' ('.count($ListeDaemons).')';
}
else
  {
  // recuperation du code de l'emoticone KO
  $Emoticon=$scenario->getData('IconKO');
  
  $message='<b><u>Etat des démons :</u></b> '.$Emoticon.' <i>('.count($ListeDaemonKO).' KO sur '.count($ListeDaemons).')</i> |';
  $message=$message.'<b><u>Liste des démons KO :</u></b> <i>';
  for ($i = 0; $i < count($ListeDaemonKO); $i++) 
      {
    
    		if($i == (count($ListeDaemonKO)-1))
              {
              $message=$message.$ListeDaemonKO[$i];
    			}
    			else
               {  
                  $message=$message.$ListeDaemonKO[$i].',';
               }   
     }
  $message=$message."</i>";
  }
// on remplace tous les | par un retour à la ligne (\n) dans la variable $message
$message=str_replace("|","\n",$message);
$cmd=cmd::byString('#[Maison][Telegram][Destinataire]#');
$cmd->execCmd($options=array('title'=>'Jeedom', 'message'=> "$message"), $cache=0);
$scenario->setLog( 'Fin monitoring des demons');

11 « J'aime »

Merci pour le partage

Ajout d’une 2eme version plus compacte.

Merci pour le partage

Merci pour ton tuto

Merci pour ce tuto très intéressant.

Bonjour,

Très intéressant. Merci
Cela arrive souvent que tes daemon soient KO (comme je ne les monitor pas) ?
Ils ne se relancent pas ?

Ça me permet d’avoir une supervision lors de la notification d’informations du jour que je reçois tous les matins.
Si le jeedom a redémarré ou autres raisons, il se peut qu’un démon ne redémarre pas pour une raison inconnue…

Ce tuto sert de base à de futurs modules de supervision de divers choses…

Je vais rajouter la supervision des batteries de mes modules sans fils, la supervision de mes capteurs d’ouverture/fermeture… celle-ci peut m’indiquer par exemple quand je quitte mon domicile si une fenêtre/porte est ouverte et me dire quelle fenêtre/porte est concernée…

Tu récupères comment les noms exactes des démons ?

Exemple je peux mettre ?
$ListeDaemons = array(‹ Blea ›,‹ Googlecast ›,‹ JMQTT ›);

1 « J'aime »

C’est le nom affiché dans la commande Jeelink « demon xxx » du démon que tu souhaites surveiller…

Je te mettrai une copie d’écran ce soir.

Plus simple

$daemon = 0;
$ok = 0;
$nok = 0 ;
$ListeDaemonKO = '';
foreach (plugin::listPlugin(true) as $plugin) {
	if ($plugin->getHasOwnDeamon() == 1) {
		$daemon ++;
		if($plugin->deamon_info()['state'] == 'ok') {
			$ok++;
		} else {
			$nok++;
			$ListeDaemonKO .= $plugin->getId() . ' '; 			
		}
	}
}

echo 'Il y a ' . $daemon . ' démons<br/>';
echo 'Il y a ' . $ok . ' démons d\'actifs<br/>';
echo 'Démons Inactifs : ' . $ListeDaemonKO;
3 « J'aime »

Effectivement c’est bcp plus simple ! ^^ je vais pouvoir simplifier mes prochains codes.

Où est ce que je peux trouver les infos détaillées des classes/fonctions : dans la documentation de l’API ?

Ici

Joli, reste plus qu’à faire un plugin. :wink:

1 « J'aime »

Merci pour ces scripts, adoptés, en remplacement d’une commande manuelle :slight_smile:

Salut, super ton code mais on l’intègre comment ?
Merci

un block CODE dans un SCENARIO, mais tout est expliqué dans le 1er message

c’est ce que j’ai fais , mais il y a un loup je recupère rien. bon je vais continuer à chercher

Hello,

Super tout fonctionne chez moi :slight_smile:

Car c’est bien ça de savoir si un deamon fonctionne pas mais que fait ton si nous avons pas accès à notre jeedom depuis un pc ou autre support c’est la catastrophe lol

En partant de ma réflexion je me suis dit ça serait bien si on pouvait relance le deamon KO depuis telegram et ensuite de refaire un état des deamon dans X minutes le temps que le demaon soit bien actif et répéter la boucle jusqu’à temps que tous les deamon soit OK.

ci-dessous j’ai un exemple de code pour start un daemon mais je ne sais pas comment intégrer au code si dessus :frowning: :

	// id du plugin
	$_plugin_Id = 'sonos3';

	// charger le plugin 
	$_plugin = plugin::byId($_plugin_Id);
	if (is_object($_plugin)) {
	    	// start deamon ...
		$scenario->setLog('démarrage du plugin ' . $_plugin_Id);    
    		$_plugin->deamon_start(true);    
		$scenario->setLog('status daemon du plugin : ' . $_plugin->deamon_info()['state']);```

Merci d'avance :)

Bonjour à tous,
Ci-après une adaptation avec :

  • Etat des démons
  • Etat des démons des antennes BLEA
  • Etat des dépendances

Le voici :
image

PS : la commande de notification est à définir en début du bloc

$cmd_id = '#Commande message souhaité#';

foreach (plugin::listPlugin(true) as $plugin) {
	if ($plugin->getHasDependency() == 1) {
		if ($plugin->dependancy_info()['state'] == 'ok') {
			$message_dependancy = $message_dependancy . $plugin->getName() . ' (' . $plugin->getId() . ') : ' . str_replace(' ','','& #127383') . "\n";// Icone OK
		} else {
			$message_dependancy = $message_dependancy . $plugin->getName() . ' (' . $plugin->getId() . ') : ' . str_replace(' ','','& #127384') . "\n";// Icone KO		
		}
	}
	if ($plugin->getHasOwnDeamon() == 1) {
		if ($plugin->deamon_info()['state'] == 'ok') {
			$message_daemon = $message_daemon . $plugin->getName() . ' (' . $plugin->getId() . ') : ' . str_replace(' ','','& #127383') . "\n";// Icone OK
		} else {
			$message_daemon = $message_daemon . $plugin->getName() . ' (' . $plugin->getId() . ') : ' . str_replace(' ','','& #127384') . "\n";// Icone KO		
		}
	}
	if ($plugin->getId() == 'blea') {
		//Plugin BLEA : core/class/blea.class.php voir fonction health()
		$sante = blea::health();// Renvoi 2 tableaux : le premier donne le nombre d'antennes et le second donne, par antenne, le nom et le statut du démon
		if ($sante[0]['result'] > 0) {
			foreach ($sante as $antenne) {
				if ($antenne['test'] != 'Nombre d\'antennes') {
						$antenne_name = str_replace('Démon ','',$antenne['test']);
					if ($antenne['result'] == 'OK') {
						$message_daemon = $message_daemon . $plugin->getName() . ' (' . $plugin->getId() . ') Antenne ' . $antenne_name . ' : ' . str_replace(' ','','& #127383') . "\n";// Icone OK
                    } else {
						$message_daemon = $message_daemon . $plugin->getName() . ' (' . $plugin->getId() . ') Antenne ' . $antenne_name . ' : ' . str_replace(' ','','& #127384') . "\n";// Icone KO		
                    }
                }
            }
        }
    }
}

$message = '<b>Etat des démons :</b>' . "\n" . $message_daemon . "\n" . '<b>Etat des dépendances :</b>' . "\n" . $message_dependancy;
$message = str_replace('Bluetooth Advertisement','BLEA',$message);

$cmd = cmd::byString($cmd_id);
$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $message), $cache=0);

@AnOnYmEnEt je n’ai pas testé ta ligne, mais si tu veux le démarrer en automatique, il suffit d’ajouter la ligne :

$plugin->deamon_start(true);

sous la ligne là de mon script :

$message_daemon = $message_daemon . $plugin->getName() . ' (' . $plugin->getId() . ') : ' . str_replace(' ','','& #127384') . "\n";// Icone KO

et à chaque exécution, il relancera les démons KO.

Bonne journée à tous

1 « J'aime »