Réveiller les noeuds dead

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;
}
1 « J'aime »