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 !