J’ai des équipements qui ne remonte pas l’état des piles aussi je cherche à mettre une alerte si 2 jours de suite la valeur n’a pas changé, par exemple la température. Pour cela j’utiliserai la date de valeur.
Est-ce qu’il y a un moyen d’utiliser les alertes sur une commande plutôt que faire un scénario qui va scruter des variables qui mémorisent les dates précédentes ?
Merci de vos conseils
Petite astuce pour configurer pleins d’équipements plus rapidement, tu peux aller dans l’onglets analyse, équipement et dans Equipement en alerte, clique sur configuration et la tu peux configuer les timeout « en masse »
Si tu souhaites faire autrement ou par scénario, tu peux utiliser lastCommunication() pour avoir la dernière date d’un équipement, ou si tu souhaites être plus précis (j’ai déjà eu le cas d’équipements qui communiquaient bien mais aucune donnée ne remontait), faire le test au niveau commande via collectDate() qui donnera la date de dernière remontée d’une valeur (<> valuedate() qui correspond à la date de la valeur)
il y a quelques temps j’avais fait ce script qui me remonte un message dans le centre de message dès lors qu’une commande spécifique d’un équipement n’a pas transféré d’information depuis xx heures.
en fonction d’un filtre par plugin, on défini le nom d’une commande (Température, Humidité, ouverture, …) et le script va chercher toutes les commandes de ce nom dans les plugins listés et remonte une erreur si il n’y a pas eu d’information collectée :
$plugins = explode(',', 'z2m,jmqtt,mqtt2');
$cmds = explode(',', 'Température,Humidité,Ouverture,Contact');
$delayNoNewValue = 48; // Délai en heures avant Alerte
$timestampAlerte = time() - ($delayNoNewValue * 60 * 60);
$alertedEqLogics = []; // Tableau pour garder une trace des équipements déjà mentionnés
foreach ($plugins as $plugin) {
$scenario->setLog('| Plugin : ' . $plugin);
foreach (eqLogic::byType($plugin, true) as $eqLogic) {
$eqLogicId = $eqLogic->getId();
$alerted = false; // Flag pour savoir si l'équipement a déjà été logué
$latestValueDate = 0; // Stocke le timestamp de la dernière valeur reçue par l'équipement
foreach ($cmds as $cmd) {
// Récupérer la commande
$command = cmd::byEqLogicIdCmdName($eqLogicId, $cmd);
if (!empty($command)) {
$valueDate = $command->getValueDate();
$valueDateTimestamp = strtotime($valueDate);
// Mettre à jour la date de dernière communication si elle est plus récente
if ($valueDateTimestamp > $latestValueDate) {
$latestValueDate = $valueDateTimestamp;
}
// Si la commande n'a pas de valeur ou que la date de la dernière valeur dépasse le délai d'alerte
if (empty($valueDate) || $valueDateTimestamp <= $timestampAlerte) {
// Si l'équipement n'a pas déjà été logué
if (!$alerted && !in_array($eqLogicId, $alertedEqLogics)) {
// Format de la date de la dernière communication
$lastCommunication = ($latestValueDate > 0) ? date('Y-m-d H:i:s', $latestValueDate) : 'Aucune donnée';
// Loguer l'équipement avec la date de dernière communication
$scenario->setLog('| Equipement en alerte : ' . $eqLogic->getHumanName() . ' - Dernière communication : ' . $lastCommunication);
message::add('Alerte équipement', 'Equipement ' . $eqLogic->getHumanName() . ' - pas de nouvelle donnée depuis plus de ' . $delayNoNewValue . 'h (Dernière communication : ' . $lastCommunication . ').');
// Ajouter l'équipement à la liste des alertés
$alertedEqLogics[] = $eqLogicId;
$alerted = true; // Marquer l'équipement comme déjà alerté
}
}
}
}
}
}
Retour
[2024-10-05 10:12:42][SCENARIO] | Plugin : z2m
[2024-10-05 10:12:42][SCENARIO] | Equipement en alerte : [CH Anna][Détecteur fenêtre] - Dernière communication : 2024-10-01 19:09:40
[2024-10-05 10:12:42][SCENARIO] | Equipement en alerte : [CH parents][Détecteur fenêtre] - Dernière communication : 2024-10-01 18:59:22
[2024-10-05 10:12:42][SCENARIO] | Equipement en alerte : [Salon][Détecteur Porte 1] - Dernière communication : 2024-10-01 18:55:53
[2024-10-05 10:12:42][SCENARIO] | Equipement en alerte : [Salon][Détecteur Porte 2] - Dernière communication : 2024-10-01 18:39:03
[2024-10-05 10:12:42][SCENARIO] | Plugin : jmqtt
[2024-10-05 10:12:42][SCENARIO] | Equipement en alerte : [Cave_][Shelly-HT] - Dernière communication : 2024-10-04 14:50:09
[2024-10-05 10:12:42][SCENARIO] | Equipement en alerte : [Chambre verte_][Température] - Dernière communication : Aucune donnée
[2024-10-05 10:12:43][SCENARIO] | Equipement en alerte : [Extérieurs][Température nord] - Dernière communication : Aucune donnée
[2024-10-05 10:12:43][SCENARIO] | Equipement en alerte : [Piscine][Température] - Dernière communication : Aucune donnée
[2024-10-05 10:12:43][SCENARIO] | Plugin : mqtt2
[2024-10-05 10:12:43][SCENARIO] | Equipement en alerte : [Piscine][Volet] - Dernière communication : Aucune donnée
(Je ne suis pas dev, c’est chatGPT qui me fait mes scripts )
Normalement, y a rien à faire sauf à faire un copier-coller dans un bloc code, mettre à jour les plugins et noms de commande concernés.
Pas de risque, le script ne fait aucune ecriture/modif equipements