Récupération du dernier message reçu

Bonjour à tous,

Je dispose de périphériques Zwave sur pile tel que les Fibaro Flood Sensor et Fibaro Smoke Sensor.
J’ai configuré la page Alerte de ces équipements avec une alerte à 4320 min (3 jours) :
image

J’ai l’impression que cette alerte ce déclenche sur la base de la dernière communication du plugin visible dans la partie « Configuration Avancée » de l’équipement :
image
Et que cette information est elle-même basée sur la date collecte la plus récente des différentes commandes de l’équipement visible dans la page « Configuration » de chacune des commandes :
image
Fuite :
image
Sabotage :
image
Température :
image
Batterie :
image
Donc ici, Température

Le délai de 3 jours étant dépassés, Jeedom génère une Alerte dans le module « Message » :
image

Quand je vais dans la vue « Configuration » de l’équipement :
image
Je vois certaines informations sur le nœud dans l’onglet Résumé et notamment les informations dernier message et prochain réveil prévu :


Si je vais sur l’onglet « Statistiques », je vois la distinction entre dernier message reçu et dernier message envoyé :

Je vois donc que mon équipement communique bien mais qu’il n’a pas mis à jour de commande (Fuite/Sabotage/Température/Batterie) et que cela a déclenché une alerte Communication Jeedom.

Voici donc ma question :slight_smile: :
Je souhaiteras savoir s’il est possible de récupérer l’information « Heure du dernier message reçu » via un bloc code ?
Ceci afin de pouvoir me faire une alerte sur les défauts d’équipements ?
J’ai regardé le plugin openzwave mais je m’y perds

Vous remerciant pour votre aide
Caelion

Cela doit être :

$DerniereCom = eqLogic::byId(id de l'équipement)->getStatus('lastCommunication');

Merci Jeandhom pour ton retour.
Cette commande permet d’obtenir l’information de la dernière communication présente au niveau de l’équipement (dans mon exemple plus haut :2020-02-11 00:18:09) mais pas l’heure du dernier message reçu (14/02/2020 13:57:40) que je cherche à obtenir.
Aurais-tu une autre piste ?

Après recherche, je n’ai pas trouvé cette donnée dans la bdd de Jeedom.
Si c’est bien le cas, elle ne peut se trouver que dans le contrôleur.
Je pense que @nechry doit pouvoir nous en dire plus.
Lorsque j’aurai un peu plus de temps, je regarderai dans son blog.

Oui c’est ce que je pense également, j’ai rien trouvé non plus dans la bdd Jeedom.
J’ai l’impression que cela se passe au niveau des fichiers node.js mais là, cela me dépasse pour les récupérer.
Merci pour tes investigations.

Salut,

J’ai suivi en diagonale la conversation… La solution est peut-être ici:
https://nechry-automation.ch/2018/06/07/api-restful/

getNodeStatistics | Récupération des statistiques de communication | info

Eureka !!!
Merci beaucoup Salvialf, et Nechry également

Voici la solution (qui n’est que l’interprétation du blog de Nechry) :

$apizwave = 'XXXXXXXXXXXXXXXXXX';
$nodeId = XX;

$url = 'http://localhost:8083/node?node_id=' . $nodeId . '&type=info&info=getNodeStatistics&apikey=' . $apizwave;
$contents = file_get_contents($url);
//$scenario->setLog('Contents :'.$contents);
$results = json_decode($contents);
$success = $results->state;
if ($success != 'ok') {
    $scenario->setLog('ZAPI TestNode return an error: ' . $results->result);
} else {
	$lastmsgreceived = $results->result->statistics->receivedTS;
	$lastmsgsended = $results->result->statistics->sentTS;
	$scenario->setLog('Dernier message reçu : ' . $lastmsgreceived);
	$scenario->setLog('Dernier message envoyé : ' . $lastmsgsended);
}
1 « J'aime »

J’en étais arrivé à ce resultat :

$apiZwave = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$nodeId = 'zz';

$url_node = 'http://localhost:8083/node?node_id=' . $nodeId . '&type=info&info=getNodeStatistics&apikey=' . $apiZwave;
$content = (file_get_contents($url_node));
$results = json_decode($content, true);
$scenario->setLog($results[result][statistics][receivedTS]);

Pour les personnes intéréssées :
Voici le résultat final du scénario avec un cron de 5 minutes :

$apikey = "XXXXXXXX";

$time_now = time();
$seuil = 24;// En heure(s)
$seuil_sec = $seuil * 60 * 60;// En secondes
$liste_en_alerte = '';

$url = 'http://localhost:8083/network?apikey=' . $apikey . '&type=info&info=getNodesList';
$contents = file_get_contents($url);
$results = json_decode($contents,true);
$success = $results["state"];
if ($success != 'ok') {
    $scenario->setLog('ZAPI TestNode return an error: ' . $results->result);
} else {
	$devices = $results["result"]["devices"];
	foreach ($devices as $node_id => $node_values){
		$node_name = $node_values["description"]["name"];
		$isListening = $node_values["capabilities"]["isListening"];
		if ($isListening == 0){// On ne conserve que les scénarios qui ne sont pas "listening" : il s'agit de ceux sur pîles
			$url2 = 'http://localhost:8083/node?apikey=' . $apikey . '&node_id=' . $node_id . '&type=info&info=getNodeStatistics';
			$contents2 = file_get_contents($url2);
			$results2 = json_decode($contents2);
			$success2 = $results2->state;
			if ($success2 != 'ok') {
    				$scenario->setLog('ZAPI TestNode return an error: ' . $results2->result);
			} else {
				$lastmsgreceived = $results2->result->statistics->receivedTS;
				$lastmsgreceived_timestamp = strtotime(substr($lastmsgreceived,0,-5));
				$absencesignal = $time_now - $lastmsgreceived_timestamp;
				if ($absencesignal > $seuil_sec){
		                	$liste_en_alerte = $liste_en_alerte . "\"\n\"" . $node_id . ' - ' . $node_name . ' depuis ' . round($absencesignal/60) . ' min';
		                }
			}
	        }
	}
}
if($liste_en_alerte != ''){
	$liste_en_alerte = str_replace(' ','','& #x1F514') . ' <b>Attention</b> ' . str_replace(' ','','& #x1F514') . "\"\n\"" . 'Détection de module(s) ne commmuniquant pas correctement :' . $liste_en_alerte;
	$message = str_replace('"','',$liste_en_alerte);// Remplacement
	$cmd = cmd::byString('#[CommandeTelegramouAutre]#');
	$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $message), $cache=0);
}

Pour le réutiliser, vos paramètres :

  • Clé API
  • Seuil modifiable
  • La commande Telegram ou autre pour le message

Bon amusement
Caelion

J’ai fait une comparaison avec un équipement à pile entre :

$results[result][statistics][receivedTS]

et

$DerniereCom = eqLogic::byId(id de l'équipement)->getStatus('lastCommunication');

Voici le résultat des logs :

[2020-02-15 11:20:20][SCENARIO] Résultat avec l'API RESTful : 2020-02-13 07:46:39:914
[2020-02-15 11:20:20][SCENARIO] Résultat avec le core de Jeedom : 2020-02-13 07:46:40

On peut constater que la valeur du core est la valeur de l’API RESTful arrondie à la seconde.
Ce qui ne semble pas être le cas chez toi.
Cela me semble inquiétant au niveau de l’intégrité de tes données en BDD.

Pas d’inquiétude mon côté.
Mon interprétation est la suivante :

  • Chez toi, les dates sont identiques car une des informations a été mise à jour. J’ai la même chose quand l’une des informations est mise à jour
  • Par contre, quand je n’ai pas d’information mises à jour, le module a juste communiqué sans envoyer de nouvelles données sur les commandes crées dans Jeedom, seul un flux sur les paramètres est réalisé.

Mon interprétation n’est pas la même.
Si l’information est dans le contrôleur, il n’y a aucune raison pour que le #plugin-openzwave ne remonte pas cette info dans le core. « lastCommunication » étant prévu pour ça.

Donc, plutôt un problème de plugin, à mon avis.

@nechry Pourrais tu nous éclairer sur ce point s’il te plaît ?
Est ce un problème uniquement chez moi ? Est ce la conception du plugin qui est faite ainsi ? Autre raison ?
Merci pour ton aide

Bonjour,

Je rencontre un problème pour remonter l’information du « Dernier message reçu » en bloc code. Je désire mettre en place une surveillance de la communication vers mes modules sur pile mais l’information « lastCommunication » me retourne une date antérieure à celle inscrite dans « Dernier message reçu » du plugin Z-Wave. Comme Caelion, la mise à jour de l’info « Dernier message reçu » se fait à chaque réveil des modules mais l’info « lastCommunication » se fait uniquement lors de l’envoie ou demande d’une valeur, donc ce n’est pas les même infos.

J’ai bien compris le script ci-dessus mais il ne peut être exécuté que sur la machine ayant le plugin Z-Wave installé, ce qui est mentionné dans la doc donc normal. Hors j’ai 2 antennes qui remonte le tout dans une vm afin de centraliser le tout.

Il y aurait-il une solution afin de récolter l’information du dernier message reçu directement depuis la vm?

Je pense à copier les fichiers JSON de mes antennes en local sur ma vm avant de les parser mais je ne les trouve pas sur mes antennes…(Enfin je ne sais pas où le trouver :slight_smile: )

Si quelqu’un aurait une ébauche de solution cela serait le bienvenu :slight_smile:

Merci beaucoup d’avance et une bonne journée!

Bonjour,

« dernier message » c’est un concept du plug-in et pas du core donc si le plugin n’est pas présent (sur la vm) cette info n’existe pas.

Mais avec la clé api du plug-in zwave de l’antenne il est techniquement possible d’appeler le démon zwave de l’antenne directement et de récupérer toutes les infos, cela depuis votre master (la vm).

Quel fichier ? La j’ai pas suivi…
Il n’existe pas de « fichier json zwave » si c’était l’idée.

Bonsoir Mips,

Merci pour vos conseils. En effet, je pensais que les infos étaient peut-être sous format JSON.

Si ce n’est pas trop demander, pourrais-tu m’aiguiller sur le comment appeler le démon Z-Wave de l’antenne afin de récupérer la valeur du dernier message reçu?

Comme je l’avais mentionner j’arrive à le faire sur la machine ayant le plugin Z-Wave installé mais depuis la VM pas moyen… D’après la doc ce comportement est voulu donc je ne sais trop comment attaquer la chose :slight_smile:

Merci beaucoup d’avance

Désolé, Je ne pense pas avoir le temps à court terme de me plonger dans le code pour voir ce qui est fait.
Je suppose qu’il y a un appel http sur le démon pour avoir cette info. Il faut répliquer cet appel.

Comment fais-tu en local ?

Bonjour Mips,

En local j’ai essayé le script plus haut dans ce fil:

'http://localhost:8083/network?apikey=' . $apikey . '&type=info&info=getNodesList';

Une bonne journée

Voila,
a distance tu fais la même requête mais tu remplaces localhost par l’ip de la machine distante.

Bonjour Mips,

Oui en effet, j’avais essayé ceci en activant également l’accès API Z-Wave sur le Jeedom client antenne mais sans résultat… Le retour du json_decode ne me donne pas d’info sur l’erreur rencontrée.

Je passerai sur la communauté régulièrement si quelqu’un sait comment faire.

Merci quand même pour ton aide et ton temps

Bonne journée à tous