sebcbien Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 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. 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 ! 6
Yohan Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 Y'a plus qu'a ! Merci Seb bon boulot
TonyC Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 Merci Seb! Trop tard pour jouer ce soir, mais vendredi je ne bosse pas alors il y aura du test dans l'air....
Krikroff Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 Merci pour le partage Sébastien Envoyé de mon iPhone àl'aide de Tapatalk
Yohan Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 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.
Yohan Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 J'ai reboot le téléphone. Loop#19 - since 00:00:17 puis il passe en Device was not found.
sebcbien Posté(e) le 12 novembre 2014 Auteur Signaler Posté(e) le 12 novembre 2014 tu as bien installé l'appli sonos ? https://play.google.com/store/apps/details?id=com.sonos.acr&hl=en 1
sebcbien Posté(e) le 12 novembre 2014 Auteur Signaler Posté(e) le 12 novembre 2014 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 ?
Yohan Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 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
Nvince76 Posté(e) le 12 novembre 2014 Signaler Posté(e) le 12 novembre 2014 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).
sebcbien Posté(e) le 12 novembre 2014 Auteur Signaler Posté(e) le 12 novembre 2014 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 ?!?
sebcbien Posté(e) le 12 novembre 2014 Auteur Signaler Posté(e) le 12 novembre 2014 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
Diuck Posté(e) le 13 novembre 2014 Signaler Posté(e) le 13 novembre 2014 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
JM13 Posté(e) le 13 novembre 2014 Signaler Posté(e) le 13 novembre 2014 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 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)
sebcbien Posté(e) le 13 novembre 2014 Auteur Signaler Posté(e) le 13 novembre 2014 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: 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
sebcbien Posté(e) le 13 novembre 2014 Auteur Signaler Posté(e) le 13 novembre 2014 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 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.
sebcbien Posté(e) le 13 novembre 2014 Auteur Signaler Posté(e) le 13 novembre 2014 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 !
Diuck Posté(e) le 13 novembre 2014 Signaler Posté(e) le 13 novembre 2014 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: 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
Diuck Posté(e) le 13 novembre 2014 Signaler Posté(e) le 13 novembre 2014 (modifié) @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 Modifié le 13 novembre 2014 par Diuck
Steven Posté(e) le 13 novembre 2014 Signaler Posté(e) le 13 novembre 2014 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 ?
Nvince76 Posté(e) le 13 novembre 2014 Signaler Posté(e) le 13 novembre 2014 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"
sebcbien Posté(e) le 13 novembre 2014 Auteur Signaler Posté(e) le 13 novembre 2014 @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 ?
Diuck Posté(e) le 13 novembre 2014 Signaler Posté(e) le 13 novembre 2014 Merci pour ta réponse Non je ne suis pas en V4 et pour les 4 lignes je n'ai rien ajouté du-tout je ne comprend pas si tu me dis ça c'est qu'il me faut les enlever je pense ?
sebcbien Posté(e) le 13 novembre 2014 Auteur Signaler Posté(e) le 13 novembre 2014 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 ..
Messages recommandés