Alerte Zwave, file d'attente importante

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 »