Module zwave dead

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 »

Un revenant :smiley:

merci, je me suis arrêté à la partie qui m’intéressait :grinning:

merci pour cet article complet, le lien que j’ai mis ne te dérange pas ?

Pas de soucis, merci pour l’info

tu peux remplacer ton 2ème code par celui que j’ai modifié, il est plus optimisé et sera moins gourmand en accès aux ressources

Ok je vais tester merci

Bonjour,

Je cherche en vain où mettre cette partie de code…pouvez vous m’aider ?
Avant de faire un scenario pur la fréquence de redémarrage du ping,
faut-il mettre ce code dans la partie « requête » du plugin script en mode « http »,« script » ?

Merci à vous