mercredi 19 novembre 2014

Un exemple de script Lua | Time : Verifier la présence de matériel IP

Introduction

Il y a quelqu'un dans le réseau ?

Vérifier la présence sur le réseau IP de son domicile présente plusieurs intérêts :
  • Vérifier qu'une caméra IP est en marche.
  • Vérifier qu'un NAS/Raspberry est disponible.
  • Savoir si une personne présente en testant la présence de son téléphone !

The machine that goes 'Ping!'

Ping est une commande informatique présente sur tous le systèmes utilisant le réseau IP. Cette commande permet de tester l'accessibilité d'une machine à travers le réseau. Le nom 'ping'  est tiré du son émis par un sonar, car le fonctionnement est le même : on émet un signal qui va rebondir sur une cible, et donc nous revenir en cas de présence (pour les tatillons ce n'est pas le même principe, car la cible doit répondre activement ... ). 

Une analogie toute bête :
  1. Pour savoir si mon ami Robert est présent dans le coin (mon réseau) je crie : "Ping robert ?"
  2. Si robert est là, il répond : "Moi, Robert je suis là" !
  3. S'il n'est pas là (ou pas en état de répondre ) : aucune réponse.

Mise en place 

Principe  :

Je vais fournir une ou plusieurs adresses IP a tester, et si cette adresse répond présent je vais allumer ou éteindre un interrupteur virtuel.

Préparation :

  • Vérifier que les machines à tester ont une adresse IP Fixe.

  • Créer autant de virtual switch qu'il y a de matériel à tester.

  • Récupérer la liste des couples : adresse IP -> switch à activer si présent.
    • 192.168.0.100  -> Camera 1.
    • 192.168.0.101 -> Camera 2.
    • 192.168.0.200  -> Téléphone de Robert.
    • .....

Le script :

à Placer dans le repertoire LUA, sous le nom : script_time_ping.lua par exemple

--Initialise la commande de retour finale
commandArray={}


--Mode deboggage (affichage des messages)
debug=true
--Prefixe pour les sorties de log
prefixe="(PING) "


--Tableau des périphériques à "pinguer"
-- Key = adresse ip à pinguer
-- Value = périphérique virtuel à switcher
local ping={}
ping['192.168.0.200']='Presence Tom'
ping['192.168.0.201']='Presence Steph'
ping['192.168.0.20']='Presence Camera Interieure'
ping['192.168.0.21']='Presence Camera Exterieure'
ping['192.168.0.100']='Presence Raspberry'

--pour chaque entree du tableau
for ip, switch in pairs(ping) do

 --Le Ping ! : -c1 = Un seul ping  ,   -w1 délai d'une seconde d'attente de réponse
 ping_success=os.execute('ping -c1 -w1 '..ip)


 --Si le ping à répondu 
 if ping_success then
   if(debug==true)then
    print(prefixe.."ping success "..switch)
   end
   --si le switch etait sur off on l'allume
   if(otherdevices[switch]=='Off') then
      commandArray[switch]='On'
   end
 else

 --Si pas de réponse
   if(debug==true)then
    print(prefixe.."ping fail "..switch)
   end
   --si le switch etait sur oN on l'eteind
   if(otherdevices[switch]=='On') then
      commandArray[switch]='Off' 
   end
 end


end




return commandArray

16 commentaires:

  1. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer
  2. j ai Domoticz sur un Nas synology

    ou je place le Script Merci
    dans quelle chemine ? si on peux me mettre l arborescence
    en merci

    RépondreSupprimer
  3. Génial,
    Enfin un site en français avec des scripts LUA pour Domoticz qui fonctionnent.
    Bravo et continuez.

    RépondreSupprimer
  4. Génial vraiment.
    Je cherchais désespérément un commande qui m'informe en cas d’arrêt des cameras, là c'est nickel.
    J'ai juste inverser les ordres de façon à ce que l'interrupteur passe sur on quand ping erreur.
    L'inter associer à un mail et voilà.

    MERCI

    RépondreSupprimer
  5. Bonjour
    comment tu crées l'interrupteur virtuel ? j'en ai essayé plusieurs mais il y a tellement de choix ...

    RépondreSupprimer
  6. RE
    en attandant de recevoir mon Raspb je teste Domoticz sur un eeebox sous windows
    dans tous les cas:
    la ligne ping_success=os.execute('ping -c1 -w1 '..ip)
    me renvoie un fail sur chaque IP testés:
    si je teste la commande sur une console cmd il me renvoie que la commande c1 necessite des privilege administrateur, peut etre que cela vient de la
    si j'allonge le temp à 3 (-w3) c'est idem
    si je vire le -c1 -w1 tous les ping sont consideré comme ok même les machines inexistante

    J'ai utilisé le mode "interrupteur" dans virtual switch mais leurs états ne changent pas

    je ne sais pas quoi faire :-(

    si vous avez une solution (ou une explication) je suis preneur

    RépondreSupprimer
    Réponses
    1. BOnjour,

      Je pense que le problème viens du faut que tu es sur windows : les options de la commande ping ne sont pas les mêmes que sur les systèmes basés sur Unix/Linux.
      Pour les interrupteurs, il faut bien dans le script avoir exactement la même casse que dans Domoticz.

      Cela sera difficile de tester pour moi, car je suis passé sous Jeedom depuis 6 mois, et j'ai reobtenir les mêmes fonctionnalités que mes scripts, sans utiliser une ligne de code.

      Je pense faire l'équivalent de mes scripts domoticz en version jeedom, pour ceux qui souhaitent migrer.

      Bon courage

      Supprimer
    2. c'est peut-etre trop tard, mais voilà la commande que j'ai utilisé pour Win.
      ping_success=os.execute('ping 192.168.1.156 -n 1 -w 100>nul')

      ce qui fait
      ping_success=os.execute('ping '..ip..' -n 2 -w 100>nul')

      Supprimer
  7. C'est déjà sympa d'avoir pris le temps de me répondre :-)
    Je vais essayer de trouver comment intégrer le ping depuis windows

    Jeedom me tente mais semble un poil propriétaire et commercial (les plugs payant ?)

    RépondreSupprimer
  8. c’était pas le poil propriétaire et commercial qui me gênait c'est que je n'ai pas encore reçu mon Raspb et que Jeedom n'existe pas sur windows :-(

    RépondreSupprimer
  9. Deux remarques:

    J'ai du faire gaffe à donner à chacun des virtual switches un "unit code" différent sous peine d'erreur "swicth already exists".
    C'est sans doute trivial pour les habitués de Domoticz, mais dans mon cas j'au un peu galéré pour comprendre (je débute)

    Ensuite, dans le script, j'ai replacé
    if(otherdevices[switch]=='Off')
    par
    if(otherdevices[switch]~='On')
    ainsi que
    if(otherdevices[switch]=='On')
    par
    otherdevices[switch] ~= 'Off')
    En effet, pour chaque switch, tant que l'affectation n'avait pas été effectuée au moins une fois, j'ai constaté que l'entrée correspondante du tableau était absente ce qui faisait qu'on entrait dans aucun des blocs "if"

    RépondreSupprimer
  10. Bonjour,
    J'ai un Rasp avec Domoticz et je me bats depuis deux jours avec ce script qui ne fonctionne pas chez moi.
    Dans le log Domoticz, j'ai le message suivant toutes les minutes :
    Error: EventSystem: /home/pi/domoticz/scripts/lua/script_time_ping.lua:1: unexpected symbol near '-'
    Mes switches virtuels sont bons, mes IP sont bonnes, mes noms sont bons, les codes sont bons. J'ai beau regarder, vérifier re-revérifier mon script par rapport à celui plus haut, je ne vois rien qui cloche.
    Quelqu'un a t'il une idée ?

    RépondreSupprimer
  11. C'est bon, j'ai trouvé. Il manquait un '-' au début du commentaire de la première ligne. D'où le message. Je suis passé à côté plusieurs fois sans le voir.

    RépondreSupprimer
  12. J evenais pour te répondre la même chose : enlever les commentaires en début de script.

    Tant mieux.

    RépondreSupprimer
  13. Si les switchs ne changent pas d’état tout seul mais que tout a l'air ok. Actionnez les une fois manuellement et après c'est tout bon :)

    En espérant que sa aide quelqu'un ^^

    RépondreSupprimer