Bonjour
J’essaie de m’en occuper dans la journée. Si tu n’as pas de nouvelles n’hésites pas à me relancer
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
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);
}
//**********************************************************
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
Lol moi aussi né en mars… Et effectivement le temps de faire le tour du bocal j’ai tout oublié aussi
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 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