Module zwave dead

Bonjour
J’essaie de m’en occuper dans la journée. Si tu n’as pas de nouvelles n’hésites pas à me relancer :wink:

Je pense avoir trouvé : Modules Dead - Forum Communauté Jeedom

merci :slight_smile:

Marche très bien, Je le poste là pour pas qu’il se perde.

Source du poste et peut être du script ? : @gblais77

//**********************************************************
// Parameters
//**********************************************************
$API_Key = 'CLE_API_ZWAVE';
$Ping_Wait = 15;
//**********************************************************


//**********************************************************
// Get list of all elements on sector
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Get list *****');
$scenario->setLog('**********************************************************');
$url_GetInfo = 'http://localhost:8083/network?apikey=' .$API_Key .'&type=info&info=getNodesList';
$Alim_List = array();
$ToPing_List = array();

$content = (file_get_contents($url_GetInfo));
$All_Info = json_decode($content, true);
$All_node = $All_Info["result"]["devices"];

foreach($All_node as $key => $value){
	$Alim = $value["capabilities"]["isListening"];
	$Controller = $value["description"]["is_static_controller"];
	if(($Alim == 1) and ($Controller != 1)){
		$test = $value["description"]["product_name"];
		$Alim_List[] = $key;
	}
}
$scenario->setLog('Number of elements: ' .count($Alim_List));
//**********************************************************


//**********************************************************
// Get health of a list of elements
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Health *****');
$scenario->setLog('**********************************************************');
foreach($Alim_List as $id){
	// $scenario->setLog('Module :'.$id);   
	$url_health = 'http://localhost:8083/node?apikey=' .$API_Key .'&node_id=' .$id .'&type=info&info=getHealth';
	$Node_health_tmp = file_get_contents($url_health);
	$Node_health = json_decode($Node_health_tmp);
	if ($Node_health->result->data->isFailed->value){
		$scenario->setLog('Module :'.$id .' is on error');	
		$ToPing_List[] = $id;
	}
	else{
		//$scenario->setLog('no problem for Module ' .$id);
	}
}
//**********************************************************


//**********************************************************
// Ping a list of elements
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Ping *****'); 
$scenario->setLog('**********************************************************');
foreach($ToPing_List as $id){
	$scenario->setLog('Ping Module :'.$id);   
	$url_ping = 'http://localhost:8083/node?apikey=' .$API_Key .'&node_id=' .$id .'&type=action&action=testNode';
	file_get_contents($url_ping);
  	sleep($Ping_Wait);
}
//**********************************************************

et ce lien me semble très intéressant : https://nechry-automation.ch/2018/06/07/api-restful/
merci @nechry, mais c’est pas gentil les images pour le code :slight_smile:

1 « J'aime »

Salut,
Je suppose que tu mets le code dans un scénario.
Que mets-tu comme fréquence de programmation ?

oui tout à fait

j’ai modifié le code d’origine avec les infos de @nechry

c’est plus simpe, cela évite de faire la liste des modules puis d’aller chercher chaque infos du module
et aussi de ne traiter que le modules actifs

EDIT 13H55, petite correction de log inutile

//**********************************************************
// Parameters
//**********************************************************
$API_Key = '**************************';
$Ping_Wait = 15;
//**********************************************************


//**********************************************************
// Liste des modules DEAD et ACTIF
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Liste des modules DEAD et ACTIF *****');
$scenario->setLog('**********************************************************');

	// $scenario->setLog('Module :'.$id);   
	$url_health = 'http://localhost:8083/network?apikey=' .$API_Key .'&type=info&info=getHealth';
    $content = file_get_contents($url_health);
  	$results = json_decode($content, true);
  	$success = $results["state"];
    if ($success == 'ok') {
      	$scenario->setLog('***** ACCES OK');
    	$devices = $results["result"]["devices"];
        $node_errors = array();
        foreach ($devices as $node_id => $node_values) {
        	$isFailed = $node_values["data"]["isFailed"]["value"];
         	$isEnable = $node_values["data"]["is_enable"]["value"]; 
          	//$scenario->setLog('DEBUG : Failed : '.$isFailed .' Enable : '.$isEnable);
            if ($isFailed & $isEnable) {
                $node_name = $node_values["data"]["description"]["name"];
          		if (count($node_errors) == 0) {
	              	$scenario->setLog('Module :'.$node_id .' '.$node_name.' est en erreur');	
					$ToPing_List[] = $node_id;
                } else {
	                $scenario->setLog('Module :'.$node_id .' '.$node_name.' est en OK');
                }
           } 
        }
    } else {
    	$scenario->setLog('ERREUR API :'.$results["result"]);	  
    }

//**********************************************************


//**********************************************************
// Ping a list of elements
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Ping *****'); 
$scenario->setLog('**********************************************************');
foreach($ToPing_List as $id){
	$scenario->setLog('Ping Module :'.$id);   
	$url_ping = 'http://localhost:8083/node?apikey=' .$API_Key .'&node_id=' .$id .'&type=action&action=testNode';
	file_get_contents($url_ping);
  	sleep($Ping_Wait);
}
//**********************************************************
1 « J'aime »

Hello @Nemeraud,

Attention tu avais partagé la clé API sur la config de la 1ère ligne :wink:

Merci

en faisant mon copier, je me suis dit, « faudra que je vire ma clé API » et en faisant le coller, j’avais déjà oublié… c’est ca d’être né en MARS…

Heureusement que tu veilles :wink:

Lol moi aussi né en mars… Et effectivement le temps de faire le tour du bocal j’ai tout oublié aussi :wink:

1 « J'aime »

Ca marche impeccable.
J’ai programmé une exécution par heure, je pense que c’est largement suffisant.
Le temps d’exécution quand tout va biien est inférieur à la seconde.
En revanche, il ne faut pas avoir trop de noeuds à réveiller mais ce n’est pas le but non plus.

et si vous voulez un petit message pour vous alerte d’un lien DEAD

//**********************************************************
// Parameters
//**********************************************************
$API_Key = 'VOTRE CLE API ZWAVE';
$Ping_Wait = 15;
$message = 'Module(s) DEAD : ';
$tagerror = 0;
//**********************************************************


//**********************************************************
// Liste des modules DEAD et ACTIF
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Liste des modules DEAD et ACTIF *****');
$scenario->setLog('**********************************************************');

	// $scenario->setLog('Module :'.$id);   
	$url_health = 'http://localhost:8083/network?apikey=' .$API_Key .'&type=info&info=getHealth';
    $content = file_get_contents($url_health);
  	$results = json_decode($content, true);
  	$success = $results["state"];
    if ($success == 'ok') {
      	$scenario->setLog('***** ACCES OK');
    	$devices = $results["result"]["devices"];
        $node_errors = array();
        foreach ($devices as $node_id => $node_values) {
        	$isFailed = $node_values["data"]["isFailed"]["value"];
         	$isEnable = $node_values["data"]["is_enable"]["value"]; 
          	//$scenario->setLog('DEBUG : Failed : '.$isFailed .' Enable : '.$isEnable);
       if ($isFailed & $isEnable) {
                $node_name = $node_values["data"]["description"]["name"];
          		if (count($node_errors) == 0) {
	              	$scenario->setLog('Module :'.$node_id .' '.$node_name.' est en erreur');	
                    $message = $message.$node_id .' '.$node_name.' '; 
					$ToPing_List[] = $node_id;
                    $tagerror = 1;
                } else {
	                $scenario->setLog('Module :'.$node_id .' '.$node_name.' est en OK');
                }
           }
        }
    } else {
    	$scenario->setLog('ERREUR API :'.$results["result"]);	  
    }
//**********************************************************

//**********************************************************
// ALERTE
//**********************************************************
if ( $tagerror == 1 ) {
    $scenario->setLog('***** ENVOI ALERTE');
	$cmd=cmd::byString('#[Communication][Centre communication][Envoi Alerte Antoine]#');
	$cmd->execCmd($options=array('title'=>'ALERTE ZWAVE', 'message'=> "$message"), $cache=0);
}

//**********************************************************
// Ping a list of elements
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Ping *****'); 
$scenario->setLog('**********************************************************');
foreach($ToPing_List as $id){
	$scenario->setLog('Ping Module :'.$id); 
	$url_ping = 'http://localhost:8083/node?apikey=' .$API_Key .'&node_id=' .$id .'&type=action&action=testNode';
	file_get_contents($url_ping);
  	sleep($Ping_Wait);
}


Je vais le programmer toutes les 4 heures

mais ce serait bien qu'il se déclenche quand le zwave envoi une alerte de module DEAD, je sais pas si c'est interceptable

si vous voulez que le lien DEAD sans tester si le lien est actif ou non

Remplacer

if ($isFailed & $isEnable) {

par

if ($isFailed) {

Là, je ne vois pas trop l’intérêt du message d’erreur, le système envoie déjà ce message d’alerte.
Tu peux déjà te l’envoyer, non?

Il y a une alerte JEEDOM oui, mais je me les envois pas

Je viens de tester avec le message d’alerte sous forme de SMS. Effectuivement, c’est sympa.
As-tu supprimé la liste des modules que tu testes dans ton log?
Je ne la vois plus apparaitre.
Ceci étant, si c’est le cas, je préfère, avoir la liste de ceux qui marchent ne présente pas vraiment d’intérêt.

Il faudrait faire la même chose pour les autres protocoles.
Un volontaire?

Je note merci beaucoup

oui j’ai mis un « edit » sur le poste du code initiale, ca ne servait que pour débug

Le tuto de Nechry est en effet une référence :slight_smile: pour les images… tout son code est sur github, plus simple à récupérer que les images!

Bonjour,

Bon j’ai pas été assez rapide, mais c’est bien le script dont je parlais.
Le mien est planifié toutes les 5 minutes.
Dans mon scénario j’ai 2 blocs code, le premier gère l’erreur « Not enough space in stream buffer detected » et le second test les noeuds morts.
Premier bloc :

$pathlog=log::getPathToLog('openzwaved');
if (file_exists($pathlog) && shell_exec('grep "Not enough space in stream buffer" ' . $pathlog . ' | wc -l') > 0) 
{
$scenario->setLog('Not enough space in stream buffer detected');
log::add('openzwave', 'error', 'Not enough space in stream buffer detected');
log::clear('openzwaved');
shell_exec('sudo pkill -f openzwaved.py');
openzwave::deamon_stop();
sleep(5);
openzwave::deamon_start();
}

Deuxième bloc :

//**********************************************************
// Parameters
//**********************************************************
$API_Key = 'API KEY';
$Ping_Wait = 15;
//**********************************************************


//**********************************************************
// Get list of all elements on sector
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Get list *****');
$scenario->setLog('**********************************************************');
$url_GetInfo = 'http://localhost:8083/network?apikey=' .$API_Key .'&type=info&info=getNodesList';
$Alim_List = array();
$ToPing_List = array();

$content = (file_get_contents($url_GetInfo));
$All_Info = json_decode($content, true);
$All_node = $All_Info["result"]["devices"];

foreach($All_node as $key => $value){
	$Alim = $value["capabilities"]["isListening"];
	$Controller = $value["description"]["is_static_controller"];
	if(($Alim == 1) and ($Controller != 1)){
		$test = $value["description"]["product_name"];
		$Alim_List[] = $key;
	}
}
$scenario->setLog('Number of elements: ' .count($Alim_List));
//**********************************************************


//**********************************************************
// Get health of a list of elements
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Health *****');
$scenario->setLog('**********************************************************');
foreach($Alim_List as $id){
	// $scenario->setLog('Module :'.$id);   
	$url_health = 'http://localhost:8083/node?apikey=' .$API_Key .'&node_id=' .$id .'&type=info&info=getHealth';
	$Node_health_tmp = file_get_contents($url_health);
	$Node_health = json_decode($Node_health_tmp);
	if ($Node_health->result->data->isFailed->value){
		$scenario->setLog('Module :'.$id .' is on error');	
		$ToPing_List[] = $id;
	}
	else{
		//$scenario->setLog('no problem for Module ' .$id);
	}
}
//**********************************************************


//**********************************************************
// Ping a list of elements
//**********************************************************
$scenario->setLog('**********************************************************');
$scenario->setLog('***** Ping *****'); 
$scenario->setLog('**********************************************************');
foreach($ToPing_List as $id){
	$scenario->setLog('Ping Module :'.$id);   
	$url_ping = 'http://localhost:8083/node?apikey=' .$API_Key .'&node_id=' .$id .'&type=action&action=testNode';
	file_get_contents($url_ping);
  	sleep($Ping_Wait);
}
//**********************************************************

J’ai jamais eu de problème avec ce scénario. Je suis en Jeedom V3 à jour.
Bonne soirée,

les codes complet des exemples sont dans mon github
c’est indiqué à la fin de l’article

1 « J'aime »