Alerte Zwave, file d'attente importante

Salut,

Il faut faire tourner scénario avec un bout de code du genre de celui-ci.

Personnellement je ne fais qu’afficher un virtuel avec « ZwaveQueueSize » sur mon Design mais bien évidemment du peux faire en sorte de recevoir une alerte … ou autre.

$networkState = openzwave::callOpenzwave('/network?type=info&info=getStatus');
$queueSize=$networkState['result']['outgoingSendQueue'];
$scenario->setData('ZwaveQueueSize', $queueSize);

Bison

Merci pour l’info, je mets ça en place

pour la dernière ligne, je mets à jour directement le virtuel

cmd::byId(23831)->event($queueSize);

1 « J'aime »

Tu as quoi comme autre script. Tu as trouvé les info où ?

Vous cherchez des scripts liés au zwave ?

Oui. Voir les possibilités offertes.

voici ceux que j’utilisent

  • Verification de l’état du réseau zwave et du nombre de commandes dans la file d’attente, met à jour un virtuel avec les 3 commandes
# Etat possible du réseau Z-Wave

# Nmbre de commande dans la file d'attente
$networkState = openzwave::callOpenzwave('/network?type=info&info=getStatus');
$queueSize=$networkState['result']['outgoingSendQueue'];
#$scenario->setData('ZwaveQueueSize', $queueSize);
cmd::byId(23831)->event($queueSize);

# STATE_STOPPED = 0
# STATE_FAILED  = 1
# STATE_RESET   = 3
# STATE_STARTED = 5
# STATE_AWAKED  = 7 : Topology loaded = TOUT EST OK
# STATE_READY   = 10 : Network ready  = TOUT EST OK
$API_Key = 'xxxxxx';
$tags['#ZWaveErreur#'] = 0;

//$scenario->setData('ZWaveStatus', -2);
$tags['#ZWaveStatus#'] = -2;
try {
   # On récupère le status du premier controleur Z-Wave
  $apizwave = jeedom::getApiKey('openzwave'); 
  $url = 'http://localhost:8083/network?type=info&info=getStatus&apikey='.$API_Key; 
  $contents = file_get_contents($url); $contents = utf8_encode($contents); 
  $scenario->setLog('***** ZWave Content: '.$contents);
  //$scenario->setData('ZWaveResult', $contents);
  $tags['#ZWaveResult#'] =  $contents;  
  $results = json_decode($contents); 
  if ($results->state == "ok") { 
    $networkState = $results->result->state; 
    //$scenario->setData('ZWaveStatus', $networkState);
    $tags['#ZWaveStatus#'] = $networkState;
  }
} catch (Exception $e) {
   //$scenario->setData('ZWaveStatus', -1);
   $tags['#ZWaveStatus#'] = -1;
   $scenario->setLog('***** ZWave Status OK');
}
$scenario->setLog('***** ZWave Status: '.$networkState);
$scenario->setLog('***********************');

// MAJ du tag.
$scenario->setTags($tags);

// status
$labelstatus="Iconnu";
if ($networkState == 0) { $labelstatus="STATE_STOPPED"; }
if ($networkState == 1) { $labelstatus="STATE_FAILED"; }
if ($networkState == 3) { $labelstatus="STATE_RESET"; }
if ($networkState == 5) { $labelstatus="STATE_STARTED"; }
if ($networkState == 7) { $labelstatus="STATE_AWAKED:Topology loaded"; }
if ($networkState == 10) { $labelstatus="STATE_READY:Network ready"; }
cmd::byId(23830)->event($networkState);
cmd::byId(23832)->event($labelstatus);
  • Vérifier les liens actifs DEAD et fait un ping + message d’alarte
//**********************************************************
// Parameters
//**********************************************************
$API_Key = 'xxxxxx';
$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);
}

  • Vérification des dernière communication pour le module BASSIN et CUVE EAU
// a voir https://jeedom-facile.fr/index.php/2018/12/18/la-surveillance-de-vos-equipements-domotiques/

$equipements = array(                   
"#[Module Physique][Niveau eau bassin][Alerte]#",                    
"#[Module Physique][Niveau eau cuve][Alerte]#"
);
$maintenant = (new DateTime(date("Y-m-d H:i:s")));
$valeurfin = ($maintenant->format('Y-m-d H:i:s'));
$valeurfin2 = ($maintenant->getTimestamp());

$scenario->setLog("maintenant : $valeurfin timestamp : $valeurfin2");

foreach ($equipements as $equipement) {
	$cmd = cmd::byString($equipement);
	$idEquipt = $cmd->getEqLogic_id();

	$equipt=eqLogic::byId($idEquipt);
  
	$nomEquipement = $equipt->getName();
	$valeurdbt= $equipt->getStatus('lastCommunication');
  
// 1er methode différence delta
	$delta = gmdate("H:i:s",strtotime($valeurfin) - strtotime($valeurdbt));
  
// 2eme methode difference timestamp
  	$temp_difftime = ($valeurfin2 - (new DateTime($valeurdbt))->getTimestamp());
  	$scenario->setLog("-----------------------------------------------------");
	$scenario->setLog("Nom du device : $nomEquipement id : $idEquipt");
	$scenario->setLog("dernière communication : $valeurdbt différence : $delta secondes : $temp_difftime");
    $scenario->setData($nomEquipement."_LastCom", $temp_difftime);
  }
  • Modules de batterie qui ne se sont pas réveillés comme prévu
// Setup
// Jeedom configuration/API/Clef API Z-Wave
$apizwave = 'xxxxxx';
$tagerror = 0;
$message = "";
// End Setup

$time_now = time();
$url_health = 'http://localhost:8083/network?type=info&info=getHealth&apikey=' . $apizwave;
$content = (file_get_contents($url_health));
//$scenario->setLog($content);
$results = json_decode($content, true);
$success = $results["state"];

if ($success != 'ok') {
    $scenario->setLog('Le réseau ZWAVE renvoie une erreur : ' . $results["result"]);
} else {
    // get the full node list
    $devices = $results["result"]["devices"];
    $node_errors = array();
    foreach ($devices as $node_id => $node_values) {
        // listening devices work on sector
        $isListening = $node_values["data"]["isListening"]["value"];
        // device can be disabled from jeedom
        $enabled = $node_values["data"]["is_enable"]["value"];
        // test only if node is enable and is battery powered
        if ($enabled & $isListening == 0) {
            // get the wake up interval
            $wakeup_interval = $node_values["data"]["wakeup_interval"]["value"];
            if ($wakeup_interval == 0) {
                // this device never wakeup by itself, continue
                continue;
            }
            // check last notification received for this node
            $next_wakeup = $node_values["data"]["wakeup_interval"]["next_wakeup"];
            // check if node didn't wakeup as expected.
            if ($next_wakeup < $time_now) {
                // special case if the device is currently mark as awake
                $isAwake = $node_values["data"]["isAwake"]["value"];
                if ($isAwake) {
                    $last_notification = $node_values["last_notification"]["receiveTime"]["value"];
                    // check if the node has been awake for more than 5 minutes
                    if ($last_notification + 300 < $time_now) {
                        // this node seems awake for too long, we're going to ping
                        $url = 'http://localhost:8085/node?node_id=' . $node_id . '&type=action&action=testNode&apikey=' . $apizwave;
                        file_get_contents($url);
                        continue;
                    }
                }
                if (count($node_errors) == 0) {
                    $scenario->setLog('****** Modules de batterie qui ne se sont pas réveillés comme prévu ******');
                  	$tagerror = 1;
                }
                // get the name of the device
                $node_name = $node_values["data"]["description"]["name"];
                // add a log entry
                $scenario->setLog('NodeId ' . $node_id . ' ' . $node_name);
                $message = $message.$node_name.'('.$node_id.') ';
                // add nodeId to the node list
                $node_errors[] = $node_id;
            }
        }
    }
    if (count($node_errors) != 0) {
        $scenario->setLog('****************************************************************');
    }
    // save nodes list for external processing
    $scenario->setData("ZWave_Nodes_Wakeup_Error", implode(',', $node_errors));
}

// 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'=> "Modules de batterie qui ne se sont pas réveillés comme prévu : ".$message ), $cache=0);  
}
  • gère l’erreur “Not enough space in stream buffer detected"
// gère l’erreur “Not enough space in stream buffer detected”

$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();
  	$scenario->setLog('Relance du demon ZWAVE');
 	// ALERTE
	$cmd=cmd::byString('#[Communication][Centre communication][Envoi Alerte Antoine]#');
	$cmd->execCmd($options=array('title'=>'ALERTE ZWAVE', 'Relance du demon ZWAVE'), $cache=0);

} else {
    $scenario->setLog('Pas de problème ZWAVE');
}

désolé, j’ai pas le nom des auteurs pour les citer :slight_smile:

3 « J'aime »

Merci. J’en avais vu certains sur le site de nechery je crois mais les tiens sont intéressant. Je n’avais que le dernier.

Tu mets ça dans un bloc code d’un scénario en remplissant les info nécéssaire. Mais après comment tu récupère les commandes ?

Ce type de commande, remonte la valeur dans une variable, que tu peux ensuite utiliser : variable (nom-variable, valeur-defaut)

$scenario->setData("ZWave_Nodes_Wakeup_Error

Ce genre de commande, stock la valeur directement dans un commande d’un virtuel, il suffit de mettre l’id de la commande

cmd::byId(23830)->event($networkState)

Plusieurs scripts nécessite la clé API zwave, j’ai mis des xxxxx pour ne pas communiquer la mienne

Et oui tu peux mettre le script dans un block code de scénario et le lancer a ta convenance

Merci beaucoup pour ton aide, le partage et ces infos complémentaires !

Pas de soucis la communauté est là pour ça, on m’a transmit ces infos, je les restitues :slight_smile:

Amuse toi bien

Dis moi j’ai mis en place le script de relace en cas de space buffet.
Mais je n’ai aucune varible ni commande de créé. Tu peux me donner un coup de mais voir ce que j’ai oublié ?

Le script relance le zwave tout seul, il y aura le log dans le scénario mais pas de remonté d’info, tu peux en ajouter si tu veux

Alors je ne comprends pas quelque chose. Tu me disait hier que ce type de ligne $scenario->setData créait une variable que je pouvais utiliser. Comment faire?
Le scénario de relance en continent

Oui tu peux l’utiliser en mettant variable(nom-variable, valeur-defaut) dans une condition ou dans une commande d’un virtuel ou en allant voir dans la page des variables

Mais dans le dernier script il n’y a pas de code de ce type

Juste des $scenario->setLog

Cette commande met des infos dans le log du scénario

Ah ok merci!

Merci pour tous ces beaux scripts !!!

Pour le moment je me limite à la queu zwave on verra par la suite si je sors la grosse artillerie :slight_smile:

1 « J'aime »

Hello,
Merci pour ces scripts que je me suis empressé de mettre en place, ou de copier dans un scenario de test, pour plus tard.
Si je peux me permettre, j’ai noté quelques coquilles et points d’amélioration :

  • les scripts demandent une APIKEY à renseigner, mais un des scripts fait mention (mais ne l’utilise pas) d’une récupération automatique de la clé zwave : $apizwave = jeedom::getApiKey(‹ openzwave ›);
    Une uniformisation serait idéale.
  • Il y a des références à des Id de commandes directement dans le code. Il serait plus propore et sur de les variabiliser en début de script. Pour éviter les erreurs.
  • Tu utilises le nom de ta commande de notification, plutot que son Id.
  • le port du reseau Zwave st en dur dans le code, et a un endroit, il n’est pas bon (8085 au lieu de 8083). Le plus générique serait de le recupérer dans le parametrage du plugin (mais je ne sais pas faire).

Voila pour les remarques, surtout pour ceux qui vont s’en servir. Ca serait dommage de casser un jeedom parce qu’une commandes info a été mise a jour par erreur.
Et encore merci pour ces codes

merci pour les retours

oui il y a surement des améliorations à y apporter, ces scripts viennent de sources diverses et bien entendu il ne faut pas les utiliser sans comprendre ce qu’ils font et les adapter à sa configuration !

ils pourraient tous être regroupés dans un seul avec usages de TAG

Bonjour,

Est-ce que quelqu’un a mis à jour ces scripts pour qu’ils soient plus génériques et autonomes par rapport aux remarques de @fwehrle ?

Généralement @Nemeraud, tu les lances quand ou à quelles occasions stp ?

Merci

Je manque un peu de motivation mais ça peut être un très bon exercice pour un apprentis dev :slight_smile: