Bonjour,
Ayant a chaque redémarrage (ou même plus rarement en dehors) plusieurs nœuds zwave qui tombent en dead et le restent jusqu’à ce que je fasse un « recharger les valeurs du nœuds » dans les actions du nœud, j’ai cherché un moyen de m’avertir et potentiellement de l’automatiser.
Ce script php semble résoudre mon problème.
A programmer dans un scénario sur timer par exemple (pas trop rapide, ca fait des appels zwave).
La partie notification des noeuds dead est commentée et a adapter à votre environnement mais la partie wake up devrait fonctionner, je laisse ca la des fois que d’autres aient le même problème.
@+
// === Début du script de vérification et réveil des nœuds Z-Wave DEAD ===
log::add('scenario', 'debug', '[ZWaveJS] === SCRIPT DÉMARRÉ ===');
$allNodes = eqLogic::byType('zwavejs');
log::add('scenario', 'debug', '[ZWaveJS] Nombre total d\'eqLogics zwavejs trouvés : ' . count($allNodes));
$enabledCount = 0;
foreach ($allNodes as $node) {
if ($node->getIsEnable()) {
$enabledCount++;
log::add('scenario', 'debug', '[ZWaveJS] Nœud activé : ' . $node->getName() .
' (EqID: ' . $node->getId() . ', LogicalId/nodeId: ' . $node->getLogicalId() . ')');
}
}
log::add('scenario', 'debug', '[ZWaveJS] Nombre de nœuds activés : ' . $enabledCount);
$deadNodes = []; // Noms pour affichage/notif
$deadEqLogics = []; // Objets eqLogic complets
$awakenedNodes = []; // Suivi des succès (queued)
foreach (eqLogic::byType('zwavejs') as $node) {
if (!$node->getIsEnable()) {
continue;
}
// Recherche tolérante de la commande "Statut nœud"
$statusCmd = null;
foreach ($node->getCmd('info') as $cmd) {
$cmdName = trim($cmd->getName());
if (stripos($cmdName, 'Statut nœud') !== false || stripos($cmdName, 'Statut') !== false) {
$statusCmd = $cmd;
log::add('scenario', 'debug', '[ZWaveJS] Commande statut trouvée pour ' . $node->getName() . ' : "' . $cmdName . '"');
break;
}
}
if (is_object($statusCmd)) {
$status = trim($statusCmd->execCmd());
log::add('scenario', 'debug', '[ZWaveJS] Statut brut pour ' . $node->getName() . ' : "' . $status . '"');
if (strcasecmp($status, 'Dead') === 0 || strcasecmp($status, 'Mort') === 0) {
$deadNodes[] = $node->getName();
$deadEqLogics[] = $node;
log::add('scenario', 'warning', '[ZWaveJS] NŒUD DEAD DÉTECTÉ : ' . $node->getName());
} else {
log::add('scenario', 'debug', '[ZWaveJS] Nœud OK : ' . $node->getName() . ' (' . $status . ')');
}
} else {
log::add('scenario', 'warning', '[ZWaveJS] Commande "Statut nœud" INTRouvable pour ' . $node->getName());
}
}
// ──────────────────────────────────────────────────────────────
// Traitement si nœuds DEAD
// ──────────────────────────────────────────────────────────────
if (count($deadEqLogics) > 0) {
$message = implode(', ', $deadNodes);
log::add('scenario', 'error', '[ZWaveJS] NŒUDS DEAD (' . count($deadNodes) . ') : ' . $message);
$scenario->setData('zwave_dead_nodes', $message);
// Notification
//$cmdNotif = cmd::byString('#[Automatisme][Pixel][(N) Notif Général]#');
//if (is_object($cmdNotif)) {
// $cmdNotif->execCmd([
// 'title' => 'Alerte Z-Wave – nœuds morts',
// 'message' => 'Nœuds Z-Wave en état DEAD : ' . $message
// ]);
// log::add('scenario', 'info', '[ZWaveJS] Notification envoyée');
//}
// ───────────────────────────────────────────────
// Tentative de RAFRAÎCHISSEMENT direct (queue les polls via méthode plugin)
// ───────────────────────────────────────────────
foreach ($deadEqLogics as $node) {
$nodeId = $node->getLogicalId();
if (empty($nodeId) || !is_numeric($nodeId)) {
log::add('scenario', 'warning', '[ZWaveJS] NodeId invalide pour ' . $node->getName());
continue;
}
// Statut AVANT
$statusCmd = null;
foreach ($node->getCmd('info') as $cmd) {
if (stripos(trim($cmd->getName()), 'Statut nœud') !== false) {
$statusCmd = $cmd;
break;
}
}
$statusAvant = is_object($statusCmd) ? trim($statusCmd->execCmd()) : 'introuvable';
log::add('scenario', 'info', '[ZWaveJS] → Tentative refreshValues sur ' . $node->getName() .
' (nodeId: ' . $nodeId . ') | Statut AVANT : ' . $statusAvant);
// Appel DIRECT de la méthode du plugin (pas d'AJAX → pas de 401)
try {
zwavejs::nodeAction('refreshValues', $nodeId);
$awakenedNodes[] = $node->getName();
log::add('scenario', 'info', '[ZWaveJS] refreshValues QUEUED avec succès sur ' . $node->getName() . ' (nodeId: ' . $nodeId . ')');
} catch (Exception $e) {
log::add('scenario', 'error', '[ZWaveJS] Erreur lors du refreshValues sur ' . $node->getName() . ' : ' . $e->getMessage());
}
// Delay + re-check statut (pour nœuds secteur ou réveil immédiat)
sleep(10);
$statusApres = is_object($statusCmd) ? trim($statusCmd->execCmd()) : 'introuvable';
log::add('scenario', 'info', '[ZWaveJS] Statut APRÈS refresh + 10s : ' . $statusApres);
sleep(2); // Pause entre nœuds pour ne pas surcharger
}
// Récapitulatif
if (count($awakenedNodes) > 0) {
log::add('scenario', 'info', '[ZWaveJS] Refresh queued sur : ' . implode(', ', $awakenedNodes));
}
log::add('scenario', 'debug', '[ZWaveJS] === SCRIPT TERMINÉ (nœuds DEAD traités) ===');
return false;
} else {
log::add('scenario', 'info', '[ZWaveJS] Aucun nœud DEAD détecté');
$scenario->setData('zwave_dead_nodes', 'Aucun');
log::add('scenario', 'debug', '[ZWaveJS] === SCRIPT TERMINÉ (tout OK) ===');
return true;
}