Signaler les pannes réseau

Signaler les pannes réseau

La mésaventure vous est peut-être familière: tranquillement installé chez vous, vous surfez sur votre smartphone. Soudain, plus rien: vous avez explosé le quota de votre forfait de données. Après une rapide investigation, vous réalisez que votre routeur ADSL est planté depuis plusieurs jours, et que pendant tout ce temps vous avez utilisé la connexion GSM de votre téléphone alors que vous pensiez être en WiFi. Si seulement vous aviez pu vous en rendre compte plus tôt... Ça tombe bien, cette semaine, on vous propose un petit bricolage tout simple pour signaler au plus vite une panne réseau.


L'idée de base est archi-simple: fabriquer une balise lumineuse qui signalerait vigoureusement toute panne de connectivité réseau.

Le hardware

Pour cela on propose d'utiliser un YoctoHub-Wireless-g pour se connecter, grâce au mode HTTP callback, à un script PHP placé sur un serveur public. Si YoctoHub-Wireless-g arrive à se connecter sur le serveur en question, c'est que le réseau marche, dans le cas contraire c'est que le réseau est cassé. Pour signaler l'état du réseau, simple anneau de LEDs RGB NEOPIXEL de Adafruit piloté par un Yocto-Color-V2 fera l'affaire.

Le schéma de notre détecteur de pannes réseau
Le schéma de notre détecteur de pannes réseau


On a utilisé un boîtier Yoctopuce légèrement modifié pour la présentation, mais n'importe boîtier semi transparent peut faire l'affaire. Vous pouvez même recycler la veilleuse de vos enfants.


Vue intérieure  Vue extérieure
Le détecteur



Le software

L'idée est de mettre à profit les séquences du Yocto-Color-V2 qui permettent de créer des animations qui sont gérées directement par le Yocto-Color. Il s'agit de créer une séquence qui met les LEDS à vert, puis au bout d'un certain temps, déclenche un clignotement rouge. Le script PHP est chargé de réinitialiser l'animation au début à chaque fois qu'il est exécuté. Ainsi, si on prend soin de définir une période verte légèrement plus longue que le délai entre deux appels au script, les LED resteront vertes tant qu'il y aura du réseau.

La seule difficulté consiste à faire clignoter les LEDs en rouge sans limite de temps à la fin de la période verte: par défaut les séquences du Yocto-Color-V2 bouclent sur elles-même, donc si l'on met la phase verte et le clignotement rouge dans la même séquence, les LEDS vont repasser par le vert.

On ne peut pas mettre le clignotement à la suite de la séquence verte...
On ne peut pas mettre le clignotement à la suite de la séquence verte...


C'est pourquoi le script PHP utilise une nouvelle fonction de l'API du Yocto-Color-V2, qui permet de faire sauter une LED d'une séquence à l'autre. On définit une première séquence qui contient la phase verte et qui se termine par un saut sur une deuxième séquence qui assure le clignotement rouge et qui va tourner en boucle.

Mais on peut faire deux séquences avec un saut entre les deux
Mais on peut faire deux séquences avec un saut entre les deux


Voici un bout de code en PHP qui illustre le principe:

  // sequence 0: vert pendant 90 secondes puis
  // saut à la sequence 1
  $leds->resetBlinkSeq(0);
  $leds->addRgbMoveToBlinkSeq(0, 0x00FF00, 00);
  $leds->addRgbMoveToBlinkSeq(0, 0x00FF00, 90000);
  $leds->addJumpToBlinkSeq(0, 1);

  // sequence 1:  flash rouge toutes les secondes
  $leds->resetBlinkSeq(1);
  $leds->addRgbMoveToBlinkSeq(1, 0xFF0000, 0);
  $leds->addRgbMoveToBlinkSeq(1, 0xFF0000, 60);
  $leds->addRgbMoveToBlinkSeq(1, 0x000000, 0);
  $leds->addRgbMoveToBlinkSeq(1, 0x000000, 1000);


Notez qu'il existe aussi maintenant la fonction addUnlinkToBlinkSeq() qui permet de déconnecter une LED d'une séquence, ce qui fait que chaque LED ne pourra l'exécuter qu'une fois. On ne l'utilise pas dans ce projet, mais elle pourrait vous être utile. Voici le code complet du script. On a ajouté le code qui définit automatiquement les séquences s'il détecte que le Yocto-Color n'est pas configuré correctement.

<?php
include("yocto_api.php");
include("yocto_colorledcluster.php");
include("yocto_network.php");
$errmsg='';
if (yregisterhub('callback',$errmsg)!=YAPI_SUCCESS)
  die('callback calls only.');
$net = yFirstNetwork();
$leds = yFirstColorLedCluster();
if (is_null($leds)) die('No led cluster found');
// Yocto-Color Configuration
if ($leds->get_activeLedCount()!=12)
 {$d=200;
  // power up blue sequence
  $leds->set_rgbColor(0,12,0x0000FF);
  $leds->resetBlinkSeq(0);
  $leds->addRgbMoveToBlinkSeq(0, 0x0000FF, 0);
  $leds->addRgbMoveToBlinkSeq(0, 0x0000FF, $d);
  $leds->addRgbMoveToBlinkSeq(0, 0x000000, 0);
  $leds->addRgbMoveToBlinkSeq(0, 0x000000, 3*$d);
  // link the leds to the blue sequences at startup
  for ($i=0;$i<12;$i++)
   $leds->linkLedToBlinkSeqAtPowerOn($i,1, 0,$i*$d);
  // no network Red blinking
  $leds->resetBlinkSeq(1);
  $leds->addRgbMoveToBlinkSeq(1, 0xFF0000, 0);
  $leds->addRgbMoveToBlinkSeq(1, 0xFF0000, 60);
  $leds->addRgbMoveToBlinkSeq(1, 0x050000, 0);
  $leds->addRgbMoveToBlinkSeq(1, 0x050000, 150);
  $leds->addRgbMoveToBlinkSeq(1, 0xFF0000, 0);
  $leds->addRgbMoveToBlinkSeq(1, 0xFF0000, 60);
  $leds->addRgbMoveToBlinkSeq(1, 0x050000, 0);
  $leds->addRgbMoveToBlinkSeq(1, 0x050000, 5000);
  // save the sequences
  for ($i=0;$i<2;$i++)
   { $leds->set_blinkSeqStateAtPowerOn($i,1);
     $leds->saveBlinkSeq($i);
     $leds->startBlinkSeq($i);
     $leds->saveLedsConfigAtPowerOn();
   }
  $leds->set_activeLedCount(12);
}
// resets the green "everything's ok" sequence
// to make sure it restarts from the beginning,
// duration in ms is set to 1.5x the HTTP callback period.
$delay = 1500*$net->get_callbackMaxDelay();
$leds->resetBlinkSeq(2);
$leds->addRgbMoveToBlinkSeq(2, 0x001000, 200);
$leds->addRgbMoveToBlinkSeq(2, 0x001000, $delay);
$leds->addJumpToBlinkSeq(2, 1);
$leds->startBlinkSeq(2);
$leds->linkLedToBlinkSeq(0,12,2,0);
Print("Done.");
?>


Pour l'instant, il n'existe pas de méthode directe pour remettre à zéro l'exécution d'une séquence, c'est pourquoi le script réinitialise la séquence verte en la redéfinissant à chaque fois. Notez que cela nous arrange parce que cela nous permet de définir automatiquement sa durée à une fois et demie la période des callbacks.

Voici une petite vidéo du système en fonctionnement.

  



Conclusion

En deux temps, trois mouvements, on a construit une petite boîte qui clignote quand il n'y a plus de wifi/réseau. Moins encombrante qu'un PC allumé en permanence, elle est aussi moins gourmande: il lui suffit d'un simple chargeur USB pour être alimentée.

Il est possible d’améliorer le concept et le script PHP pour qu'il enregistre l'heure de tous les callbacks, ce qui permettrait de reconstruire un historique des pannes réseau.

Une dernière chose: Si vous souhaitez utiliser ces nouvelles fonctions de gestions des séquences, n'oubliez pas de mettre à jour votre API et le firmware de votre Yocto-Color-V2.

Commenter 2 commentaires Retour au blog



1 - mesnirmou Vendredi 12 janvier 2018 8H21

Bonjour,
Dans le même esprit je voudrais vérifier si le boost de ma VMC est activé.
Ma WMC est connectée à ma domotique KNX, je peut avoir du 5v en sortie d'un module relié au bus, à chaque fois que le boost est activé. Ce qui alimenterait votre module qui à travers la LED affichera une animation. Je suis intéressé par l'animation bleu dans votre démo vidéo, qui rappelle un ventilateur tournant. Cette animation est obtenue par programmation ou c'est un affichage par défaut au démarrage? Si c'est le cas cool c'est ce qui me faudrait pile poile.
Merci d'avance

2 - martinm (Yocto-Team)Vendredi 12 janvier 2018 8H25

C'est une animation préprogrammée par les lignes

$d=200;
// power up blue sequence
$leds->set_rgbColor(0,12,0x0000FF);
$leds->resetBlinkSeq(0);
$leds->addRgbMoveToBlinkSeq(0, 0x0000FF, 0);
$leds->addRgbMoveToBlinkSeq(0, 0x0000FF, $d);
$leds->addRgbMoveToBlinkSeq(0, 0x000000, 0);
$leds->addRgbMoveToBlinkSeq(0, 0x000000, 3*$d);


Plus d'explications ici:
www.yoctopuce.com/FR/article/animer-des-leds-rgb-avec-un-yocto-color-v2

Yoctopuce, get your stuff connected.