Module zwave dead

bonjour à tous

une de mes prises zwave est passée en dead, les commandes ne fonctionnaient plus.

elle est revenue à la vie avec un ping lancé manuellement

il n’y aurait pas moyen que cela se fasse automatiquement ?

Salut,
Que veux-tu dire par automatiquement ?
Il faudrait faire une surveillance permanente de tous les noeuds pour pinguer ceux en erreur.
Ça ralentirait drôlement Jeedom.

Bonjour
Sur l’ancien forum il y a avait un script qui vérifiait les noeuds zwave. Il est peut-être encore en ligne. Je n’ai pas accès à mes scenarios depuis mon portable. Mais si besoin je peux le recopier ici quand je serai devant mon ordi.
Bonne soirée

je veux bien merci, après je sais pas si on peut relancer le ping du module dans un scénario

je reçois une alerte qui me dit que mon noeud est mort, il pourrait relancer un ping 5,10 mn après

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?