Aller au contenu

Detection De Présence


sebcbien

Messages recommandés

Bonjour,

Suite à  une conversation en MP avec un de nos admin chéri ;-), voici ma solution pour détecter la présence via smartphone.

L'idée est de savoir quand ma femme ou moi même sommes à  la maison afin de pouvoir lancer des scénarios ou en bloquer l’exécution.

 

12-11-14 21-16-07.png

 

J'ai fait ça il y a longtemps, et bien sur je n'ai pas tout fait tout seul.

Je me souviens avoir fait quelques modifications pour que ça tourne comme je le voulais, mais je ne sais plus lesquelles.

 

Bref, voici le package complet, pour certains scripts, comme pour le ping par exemple la base est de Krikroff et j'ai laissé le copyright.

 

J'ai mis le Virtual Device en attach et le code du bouton ci-dessous

.

IP Smartphone Presence Check V1.0.vfib

 

!!! voir post plus loin dans le fil pour les V1.1 V1.2 V1.3 V2.0 et suivantes !!!

V2.1 ici: https://www.domotique-fibaro.fr/topic/2613-detection-de-prã©sence/?do=findComment&comment=121355

 

V1.3 ici: http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/page-3#entry35219

 

- il faut créer une variable globale (non prédéfinie) par device à  surveiller (moi j'utilise "Phone_GG_Present" pour le tel de ma femme) et la déclarer en début de script du bouton.

- il faut encoder l'adresse IP du téléphone dans les paramètres du Virtual device (pensez à  déterminer une ip Wifi fixe pour votre smartphone)

- il faut encoder le port ouvert sur votre téléphone dans les paramètres du Virtual device (3500 ou 3401)

- Sur Androà¯d, il n'y a pas de port ouvert par défaut pour accepter le ping, le moyen le plus simple est d'installer l'application Sonos et a lancer, c'est tout (pas besoin d'avoir du matos sonos pour que ça fonctionne)

- Sur iPhone idem, mais je n'ai pas testé personellement

- si vous ne voulez pas utiliser le mainloop comme "scheduler" , créez simplement une scène qui va cliquer sur le bouton de demande de présence toutes les minutes... ou avec l'excellent GEA, avec la ligne ci-dessous (à  adapter):

-- Mise à  jour des Présences par détection d'adresses IP toutes les minutes
  GEA.add(true , 1*60, "",{{"VirtualDevice", id["VD_PRESENCE_SEB"], "1"},{"VirtualDevice", id["VD_PRESENCE_GG"], "1"},{"Repeat"}}) 

 

Notification de présence en utilisant GEA, entre 8h et 21h: N'oubliez pas de mettre les VG dans l'entête. Ces exemple sont repris dans le post GEA de ma signature

--------------DETECTION PRESENCE--------------
-- Signale GG at Home GEA peux se déclencher sur un changement de valeur d'une variable global
  GEA.add({"Global", "Phone_GG_Present", "1"}, -1, "Presence GG est maintenant à  #value#", {{"Portable", 53}, {"Time", "08:00", "21:00"}})
  GEA.add({"Global", "Phone_GG_Present", "0"}, -1, "Presence GG est maintenant à  #value#", {{"Portable", 53}, {"Time", "08:00", "21:00"}})

Code bouton VD détect presence V1.0 (ancien code):

 

-- IP Smartphone Presence Check V1.0
-- Copyright © 2014 Sébastien Jauquet.
-- http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/

--Using code from:
-- Ping v 1.0.1 [05-2013]
-- Copyright © 2013 Jean-christophe Vermandé
-- http://www.domotique-fibaro.fr/index.php/topic/109-ping-dun-%C3%A9quipement-r%C3%A9seau/page-2


fibaro:log("Starting process");


local _deviceIp = "192.168.10.112";
local variable_globale_phone = "Phone_GG_Present";
local _devicePort = 3500;
local _maxRetryProcess = 20;
local time = tonumber(os.time());
local maxtime = 56;


-- fibaro:setGlobal("Lock_Away","Unlocked") 


function SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00:00:00";
  else
    nHours = string.format("%02.f", math.floor(nSeconds/3600));
    nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
    nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
    return nHours..":"..nMins..":"..nSecs
  end
end




-- recursive function to ping device
local function _ping(retry)
  retry = retry or 0;


-- notify state
local elapsed = os.difftime(os.time(), tonumber(time));
local msg = "Loop #".. retry .." since "..SecondsToClock(elapsed);    
fibaro:log(msg);  


-- check for no more than 30 seconds
  if elapsed > maxtime then 
  return false; 
  end


  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --send packet
  local bytes, errorCode = tcpSocket:write("test");


  --check for error   
  if errorCode == 0 then
    return true;
  else
    if retry < _maxRetryProcess then
      --fibaro:log("Retry process, please wait...");
      fibaro:sleep(1*750);
      return _ping(retry + 1);
    end
    return false;
  end
end


--ping device, secure with pcall to catch errors.
local f, result = pcall(_ping);
local Lock_Away = fibaro:getGlobal("Lock_Away")


if (f) then
  if (result == true) and (Lock_Away == "Unlocked") then
    fibaro:log("Device has been found.");
    fibaro:setGlobal(variable_globale_phone,"1") 
    -- fibaro:setGlobal("Present_Phones",os.time()) 
  else
    fibaro:log("Device was not found!");
    fibaro:setGlobal(variable_globale_phone,"0") 
  end
else
  fibaro:log("Error: " .. f);
end

Code main loop du VD

 

local thismodule = fibaro:getSelfId(); 
local status = fibaro:getGlobal("Phone_GG_Present")
-- fibaro:debug(thismodule);
if
status == "0"
then 
fibaro:call(thismodule, "setProperty", "currentIcon", 1037)
end


if
status == "1"
then 
fibaro:call(thismodule, "setProperty", "currentIcon", 1036)
end


fibaro:sleep(1000);

Ce n'est certainement pas le code le plus "léché" mais je pense que ça en aidera quand même certains... et puis c'est "tout fait" ;-)

 

Le script va détecter quasi instantanément lorsque le smartphone apparaît sur le réseau, mais pourra mettra jusqu'à  une minute pour valider son absence

 

Enjoy !

12-11-14 21-16-07.png

User_GG_icon_Absent.png

User_GG_icon_present.png

User_Seb_icon_Absent.png

User_Seb_icon_present.png

  • Upvote 6
Lien vers le commentaire
Partager sur d’autres sites

Variable créée.

Adresse IP fixe créée.

VD installé.

 

1er essai :

Loop#1 - since 00:00:01

Loop#2 - since 00:00:04

Loop#3 - since 00:00:10

 

etc jusque 23 secondes puis je déconnectes du réseau Wifi et je reconnecte. Depuis => Device was not found.

 

Une idée Seb ?

 

PS: J'ai déplacé le sujet dans la section Tuto. ;)

Lien vers le commentaire
Partager sur d’autres sites

et ces valeurs ?

 

elles définissent le nombre d'essais et le temps max (il faut rester sous la minute)

local _maxRetryProcess = 20;
local maxtime = 56;
 
mais le problème No 1 est que ton tel ne réponds pas au ping... 
tu as essayé dans une fenètre cmd un ping de ton ip ?
Lien vers le commentaire
Partager sur d’autres sites

Microsoft Windows [version 6.0.6002]

Copyright (c) 2006 Microsoft Corporation. Tous droits réservés.

C:\Users\Yo&Vir>ping 192.168.1.50

Envoi d'une requête 'Ping' 192.168.1.50 avec 32 octets de données :

Réponse de 192.168.1.50 : octets=32 temps=2225 ms TTL=64

Réponse de 192.168.1.50 : octets=32 temps=2 ms TTL=64

Réponse de 192.168.1.50 : octets=32 temps=420 ms TTL=64

Réponse de 192.168.1.50 : octets=32 temps=200 ms TTL=64

Statistiques Ping pour 192.168.1.50:

Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),

Durée approximative des boucles en millisecondes :

Minimum = 2ms, Maximum = 2225ms, Moyenne = 711ms

Lien vers le commentaire
Partager sur d’autres sites

Astucieux. Bravo.

 

Sinon dans le même type que j'ai en tête pour quelque chose de similaire (avec une approche complètement différente), mais pas encore eu le temps de mettre en place = Utilisation de Tasker couplé à  Locale (qui au passage est très précis).

Lien vers le commentaire
Partager sur d’autres sites

tu dois avoir une erreur de syntaxe, la partie ping vient de Krikroff et est stable.. ?!?

vérifie l'ip, les guillemets etc. tu as importé le vfib ou copié le code ?

 

ce qui est bizarre c que chez moi il met 55 secondes pour faire 16 checks et toi tu fais 19 checks en 17 secondes ?!?

Lien vers le commentaire
Partager sur d’autres sites

essaye de faire un telnet:

telnet 192.168.10.111 3500

ensuite Enter 2X devrait donner ce résultat:

 
HTTP/1.1 408 Request Timeout
Content-type: text/html
Server: Linux UPnP/1.0 Sonos/27.2-81201 (ACR_:LGE:hammerhead:Nexus 5)
Connection: close


<HTML><HEAD><TITLE>Error 408</TITLE></HEAD><BODY><H1>Error 408</H1><P>Request Timeout</P></BODY></HTML>
sinon, c'est que ton android ne réponds pas:
telnet 192.168.10.111 3400
connecting To 192.168.10.111...Could not open connection to the host, on port 3400: Connect failed
Lien vers le commentaire
Partager sur d’autres sites

Salut sebcbien

 

Je trouve ton tutoriel sur la détection de présence super !!  mais n'étant pas un pro en la matière j'ai quelque problème à  le mettre en place alors je me permet de faire appel à  ton aide pour me guider si tu le veux bien.

j'ai bien créer un module virtuel avec "IP Smartphone Presence Check V1.0.vfib" jusque la pas de problème  bien sur en remplacent l'adresse IP voir copie d’écran ci dessous merci de me confirmer.

 

J'aurais bien sur plusieurs questions je vais déjà  commencer par la première 

 

Faut t'il remplir les cases adresse IP et Port TCP  copie d’écran ci-jointe ?

 

Avant d'aller plus loin je vais attendre ta réponse 

 

D'avance merci

post-495-0-36543100-1415843111_thumb.png

post-495-0-08579500-1415843422_thumb.png

post-495-0-37049300-1415843428_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

Merci du partage c'est toujours intéressant de voir comment d'autres contributeurs prennent un sujet.

 

Pour ma part, j'utilise le module "Freebox" développé par Krikroff et en passant par les adresses MAC ça marche aussi.

 

Par contre, j'ai un petit problème qui vient du téléphone car quand je veux lancer une action (par exemple un message d’accueil lorsque la personne entre qqle part) le temps de détection est rapide mais c'est mon téléphone qui traîne à  se connecter au Wifi.

 

C'est-à -dire qu'il peut mettre une minute ou 2 pour se connecter au wifi ...et dès que connecté au wifi ..je lance les actions.

 

cette latence globale (1 à  2 minutes) rend la fonction pas facilement utilisable  :huh: pour des scénes réactives mais permet quand même de savoir si la personne et à  la maison !!! (par exemple je sais quand mes enfants rentre de l'école)

Lien vers le commentaire
Partager sur d’autres sites

Salut sebcbien

 

Je trouve ton tutoriel sur la détection de présence super !!  mais n'étant pas un pro en la matière j'ai quelque problème à  le mettre en place alors je me permet de faire appel à  ton aide pour me guider si tu le veux bien.

j'ai bien créer un module virtuel avec "IP Smartphone Presence Check V1.0.vfib" jusque la pas de problème  bien sur en remplacent l'adresse IP voir copie d’écran ci dessous merci de me confirmer.

 

J'aurais bien sur plusieurs questions je vais déjà  commencer par la première 

 

Faut t'il remplir les cases adresse IP et Port TCP  copie d’écran ci-jointe ?

 

Avant d'aller plus loin je vais attendre ta réponse 

 

D'avance merci

 

Suite à  ta demande, j'ai amélioré le module, 

Voici donc la V1.1, IP Smartphone Presence Check V1.1.vfib qui prend les paramètres dans les champs de config du VD.

 

Exemple de config:

 

post-826-0-27781300-1415870563_thumb.jpg
 
pour ceux qui veulent le code direct, seul celui du bouton à  changé:
 
-- IP Smartphone Presence Check V1.1
-- Copyright © 2014 Sébastien Jauquet.
-- http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/
--Using code from:
-- Ping v 1.0.1 [05-2013]
-- Copyright © 2013 Jean-christophe Vermandé
-- http://www.domotique-fibaro.fr/index.php/topic/109-ping-dun-%C3%A9quipement-r%C3%A9seau/page-2


fibaro:log("Starting process");


local variable_globale_phone = "Phone_GG_Present";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule, 'IPAddress')
local _devicePort = fibaro:get(thismodule, 'TCPPort')
local _maxRetryProcess = 20;
local time = tonumber(os.time());
local maxtime = 56;


-- local _deviceIp = "192.168.10.112";
-- local _devicePort = 3500;
-- fibaro:debug(_deviceIp .. " " .. _devicePort)
-- fibaro:setGlobal("Lock_Away","Unlocked") 


function SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00:00:00";
  else
    nHours = string.format("%02.f", math.floor(nSeconds/3600));
    nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
    nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
    return nHours..":"..nMins..":"..nSecs
  end
end


-- recursive function to ping device
local function _ping(retry)
  retry = retry or 0;


-- notify state
local elapsed = os.difftime(os.time(), tonumber(time));
local msg = "Loop #".. retry .." since "..SecondsToClock(elapsed);    
fibaro:log(msg);  


-- check for no more than 30 seconds
  if elapsed > maxtime then 
  return false; 
  end


  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
    fibaro:debug(_deviceIp .. " " .. _devicePort)
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --send packet
  local bytes, errorCode = tcpSocket:write("test");
  fibaro:debug(errorCode)


  --check for error   
  if errorCode == 0 then
    return true;
  else
    if retry < _maxRetryProcess then
      --fibaro:log("Retry process, please wait...");
      fibaro:sleep(1*750);
      return _ping(retry + 1);
    end
    return false;
  end
end


--ping device, secure with pcall to catch errors.
local f, result = pcall(_ping);
local Lock_Away = fibaro:getGlobal("Lock_Away")


if (f) then
  if (result == true) and (Lock_Away == "Unlocked") then
    fibaro:log("Device has been found.");
    fibaro:setGlobal(variable_globale_phone,"1") 
-- évolution future possible: stocker la date et l'heure de la dernière présence détectée
    -- fibaro:setGlobal("Present_Phones",os.time()) 
  else
    fibaro:log("Device was not found!");
    fibaro:setGlobal(variable_globale_phone,"0") 
  end
else
  fibaro:log("Error: " .. f);
end

post-826-0-27781300-1415870563_thumb.jpg

Lien vers le commentaire
Partager sur d’autres sites

Pour ma part, j'utilise le module "Freebox" développé par Krikroff et en passant par les adresses MAC ça marche aussi.

 

Par contre, j'ai un petit problème qui vient du téléphone car quand je veux lancer une action (par exemple un message d’accueil lorsque la personne entre qqle part) le temps de détection est rapide mais c'est mon téléphone qui traîne à  se connecter au Wifi.

 

C'est-à -dire qu'il peut mettre une minute ou 2 pour se connecter au wifi ...et dès que connecté au wifi ..je lance les actions.

 

cette latence globale (1 à  2 minutes) rend la fonction pas facilement utilisable  :huh: pour des scénes réactives mais permet quand même de savoir si la personne et à  la maison !!! (par exemple je sais quand mes enfants rentre de l'école)

 

J'avais vu la solution de KK avec la freebox, mais en Belgique, pas de freebox ;-)

Chez moi avec des Nexus 5 et 4, le temps de réaction est relativement rapide, mais je ne l'utiliserais pas pour de process rapides. Une connexion wifi est instable, il y a toujours des zones "mortes".

Ton téléphonne, probablement pour des questions d'énergie, ne scanne pas le wifi toutes les secondes.

Lien vers le commentaire
Partager sur d’autres sites

tu dois avoir une erreur de syntaxe, la partie ping vient de Krikroff et est stable.. ?!?

vérifie l'ip, les guillemets etc. tu as importé le vfib ou copié le code ?

 

ce qui est bizarre c que chez moi il met 55 secondes pour faire 16 checks et toi tu fais 19 checks en 17 secondes ?!?

 

J'ai remarqué que quand le ping va aussi vite, c'est que il y a bien un device qui réponds à  l'adresse ip, mais que le port est fermé.

Il y a un logiciel super pratique sur Androà¯d (la version iPhone est plus pauvre), qui permet de scanner un réseau et aussi les ports ouverts d'un device:

Fing, outil très puissant que j'utilise souvent !

Lien vers le commentaire
Partager sur d’autres sites

 

Suite à  ta demande, j'ai amélioré le module, 

Voici donc la V1.1, attachicon.gifIP Smartphone Presence Check V1.1.vfib qui prend les paramètres dans les champs de config du VD.

 

Exemple de config:

 

 
 
pour ceux qui veulent le code direct, seul celui du bouton à  changé:
 
--[[
%% properties
%% globals
--]]


-- IP Smartphone Presence Check V1.1
-- Copyright © 2014 Sébastien Jauquet.
-- http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/
--Using code from:
-- Ping v 1.0.1 [05-2013]
-- Copyright © 2013 Jean-christophe Vermandé
-- http://www.domotique-fibaro.fr/index.php/topic/109-ping-dun-%C3%A9quipement-r%C3%A9seau/page-2


fibaro:log("Starting process");


local variable_globale_phone = "Phone_GG_Present";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule, 'IPAddress')
local _devicePort = fibaro:get(thismodule, 'TCPPort')
local _maxRetryProcess = 20;
local time = tonumber(os.time());
local maxtime = 56;


-- local _deviceIp = "192.168.10.112";
-- local _devicePort = 3500;
-- fibaro:debug(_deviceIp .. " " .. _devicePort)
-- fibaro:setGlobal("Lock_Away","Unlocked") 


function SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00:00:00";
  else
    nHours = string.format("%02.f", math.floor(nSeconds/3600));
    nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
    nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
    return nHours..":"..nMins..":"..nSecs
  end
end


-- recursive function to ping device
local function _ping(retry)
  retry = retry or 0;


-- notify state
local elapsed = os.difftime(os.time(), tonumber(time));
local msg = "Loop #".. retry .." since "..SecondsToClock(elapsed);    
fibaro:log(msg);  


-- check for no more than 30 seconds
  if elapsed > maxtime then 
  return false; 
  end


  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
    fibaro:debug(_deviceIp .. " " .. _devicePort)
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --send packet
  local bytes, errorCode = tcpSocket:write("test");
  fibaro:debug(errorCode)


  --check for error   
  if errorCode == 0 then
    return true;
  else
    if retry < _maxRetryProcess then
      --fibaro:log("Retry process, please wait...");
      fibaro:sleep(1*750);
      return _ping(retry + 1);
    end
    return false;
  end
end


--ping device, secure with pcall to catch errors.
local f, result = pcall(_ping);
local Lock_Away = fibaro:getGlobal("Lock_Away")


if (f) then
  if (result == true) and (Lock_Away == "Unlocked") then
    fibaro:log("Device has been found.");
    fibaro:setGlobal(variable_globale_phone,"1") 
-- évolution future possible: stocker la date et l'heure de la dernière présence détectée
    -- fibaro:setGlobal("Present_Phones",os.time()) 
  else
    fibaro:log("Device was not found!");
    fibaro:setGlobal(variable_globale_phone,"0") 
  end
else
  fibaro:log("Error: " .. f);
end

 

Un grand merci je test ca  :60:

Lien vers le commentaire
Partager sur d’autres sites

@Sebcbien

 

j'essaye de créer la variable peux tu me confirmer stp 

 

Question

 

Pour l'adresse IP c'est bien celle du portable ? et pour le port TCP je met quoi ?

 

D'avance merci

post-495-0-52824500-1415879917_thumb.png

post-495-0-90692400-1415880102_thumb.png

Modifié par Diuck
Lien vers le commentaire
Partager sur d’autres sites

Sympa la méthode.

 

Perso, Tasker. Si je suis connecté à  mon Wifi alors je lance un scénario ou modifie un variable globale. Si je perds mon Wifi même chose mais en inversant le statut.

 

Mais bon, faut aimer Tasker ... heuuuuu ... Existe-il quelqu'un sous Android qui n'aime pas Tasker ? :)

Lien vers le commentaire
Partager sur d’autres sites

oui Steven (et loin de moi de chercher à  détourner un sujet), mais tasker couplé à  locale amène beaucoup de possibilités sans code ajouté (ou peu).

De mémoire, Locale permet également de lancer des notif à  tasker basées sur les calendriers Google (mais comme dit plus haut, je n'ai pas eu le temps de m'y remettre depuis un certain temps).

 

@ JM13, je posterai sur un sujet dédié autre que celui-ci afin de ne pas le polluer, mon intervention était d'apporter une solution alternative (plus souple? plus fiable? aucune idée..) à  un problème donné de "détection de présence" 

Lien vers le commentaire
Partager sur d’autres sites

@Sebcbien

 

j'essaye de créer la variable peux tu me confirmer stp 

 

Question

 

Pour l'adresse IP c'est bien celle du portable ? et pour le port TCP je met quoi ?

 

D'avance merci

 

le port, comme sur mon screenshot: 3500 (port ouvert par l'applis sonos).

Pour le selfid... heuu tu es en V4 ou quoi ?

Pourquoi as-tu rajouté :les 4 lignes d'entête dans le main loop ?

Lien vers le commentaire
Partager sur d’autres sites

le code que tu montre est celui du main loop, pas celui du bouton...

Pour le main loop il ne faut pas ces 4 lignes de paramètres. (pour le bouton non plus d'ailleurs, je l'ai l'enlevé -> V1.2  IP Smartphone Presence Check V1.2.vfib  )

Le mieux est d'effacer et de réimporter le .vfib

Sur iPhone, j'imagine que ça doit aller, mais oui, comme dit dans le premier post...  il faut installer l'appli sonos ou trouver un port ouvert par défaut sur l'iPhone... là  je passe le relais ;-)

-- IP Smartphone Presence Check V1.2
-- Copyright © 2014 Sébastien Jauquet.
-- http://www.domotique-fibaro.fr/index.php/topic/2613-detection-de-pr%C3%A9sence/
--Using code from:
-- Ping v 1.0.1 [05-2013]
-- Copyright © 2013 Jean-christophe Vermandé
-- http://www.domotique-fibaro.fr/index.php/topic/109-ping-dun-%C3%A9quipement-r%C3%A9seau/page-2


fibaro:log("Starting process");


local variable_globale_phone = "Phone_GG_Present";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule, 'IPAddress')
local _devicePort = fibaro:get(thismodule, 'TCPPort')
local _maxRetryProcess = 20;
local time = tonumber(os.time());
local maxtime = 56;


-- local _deviceIp = "192.168.10.112";
-- local _devicePort = 3500;
-- fibaro:debug(_deviceIp .. " " .. _devicePort)
-- fibaro:setGlobal("Lock_Away","Unlocked") 


function SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00:00:00";
  else
    nHours = string.format("%02.f", math.floor(nSeconds/3600));
    nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
    nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
    return nHours..":"..nMins..":"..nSecs
  end
end


-- recursive function to ping device
local function _ping(retry)
  retry = retry or 0;


-- notify state
local elapsed = os.difftime(os.time(), tonumber(time));
local msg = "Loop #".. retry .." since "..SecondsToClock(elapsed);    
fibaro:log(msg);  


-- check for no more than 30 seconds
  if elapsed > maxtime then 
  return false; 
  end


  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
    fibaro:debug(_deviceIp .. " " .. _devicePort)
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --send packet
  local bytes, errorCode = tcpSocket:write("test");
  fibaro:debug(errorCode)


  --check for error   
  if errorCode == 0 then
    return true;
  else
    if retry < _maxRetryProcess then
      --fibaro:log("Retry process, please wait...");
      fibaro:sleep(1*750);
      return _ping(retry + 1);
    end
    return false;
  end
end


--ping device, secure with pcall to catch errors.
local f, result = pcall(_ping);
local Lock_Away = fibaro:getGlobal("Lock_Away")


if (f) then
  if (result == true) and (Lock_Away == "Unlocked") then
    fibaro:log("Device has been found.");
    fibaro:setGlobal(variable_globale_phone,"1") 
-- évolution future possible: stocker la date et l'heure de la dernière présence détectée
    -- fibaro:setGlobal("Present_Phones",os.time()) 
  else
    fibaro:log("Device was not found!");
    fibaro:setGlobal(variable_globale_phone,"0") 
  end
else
  fibaro:log("Error: " .. f);end
..
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...