Aller au contenu
Dragoniacs

[HC3] Détection de présence

Recommended Posts

Bonjour,

j'ai cru comprendre que ça ne pingait pas

mais peut on adapter pour pinger

dans la HC2, si détection par capteur extérieur (trigg-1 dans GEA) donc appui sur BP "Check if iphone is Present" du VD IP Smartphone Presence Check V1.2-- Copyright © 2014 Sébastien Jauquet.

, alors notif sur phone, ça le réveillait et donc accroche du wifi (si présent) et ping 

 

le code du VD avec un BP sur la HC2 était celui ci, est il possible de l'adapter sur la HC3?

-- 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:call(759, "sendDefinedPushNotification", "99");
fibaro:sleep(6*1000);
fibaro:log("Starting process");
 
local variable_globale_phone = "Phone_Alex";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule, 'IPAddress')
local _devicePort = fibaro:get(thismodule, 'TCPPort')
local _maxRetryProcess = 5;
local time = tonumber(os.time());
local maxtime = 14;

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 = "Boucle #".. retry .." depuis "..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
  if result == true then
    fibaro:log("Appareil a été trouvé.");
    fibaro:setGlobal(variable_globale_phone,"Present") 
	-- é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("Appareil non trouvé!");
    fibaro:setGlobal(variable_globale_phone,"Absent") 
  end
else
  fibaro:log("Error: " .. f);
end

 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

salut flamalex. en fait, ce QA fonctionne bien sur mac. Mais il y a des nuances :
1) personnellement j'ai commencé à travailler normalement quand j'ai mis plus de délais et plus de contrôles... tout est dans le code...
2) voici comment je l'ai personnellement configuré:
self.maxRetry_Process = 10 - nombre de recherche maximum
    self.scheduler_value = 5 - minutes entre 2 recherches téléphoniques
    self.check_wait = 10 - seconde entre 2 ping

3) vous devez savoir et comprendre, si vous avez 1 routeur avec 1 adaptateur wifi à la maison, vous pouvez facilement trouver l'adresse mac de votre téléphone sur votre routeur et tout fonctionnera bien
4) si vous avez plusieurs routeurs à la maison avec différents SSID (noms), alors TOUS les téléphones ont ce qu'on appelle une protection, sous la forme d'une randomisation de l'adresse mac du téléphone pour différents SSID. Mais dans les paramètres du téléphone spécifiquement pour ce SSID, vous pouvez désactiver la randomisation, puis sur tous les appareils de votre maison, il y aura 1 MAC d'origine.
5) si vous ne voulez pas ou ne pouvez pas désactiver la randomisation, vous devrez faire plusieurs QA pour chaque mac

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci @fastvd pour ces explications 

je comprends bien 

mon utilisation est un peu « détournée »

je m’explique, lorsque l’alarme est activée TOTAL, alors les 2 phones sont forcés en absent. Si alarme désactivée ils sont forcés en présent. 
A quoi me sert le Ping? Eh bien, si je rentre et qu’une barrière extérieur me détecte alors la box envoie une notification sur les 2 phones pour les réveiller 

si l’un des 2 phones accroche le wifi, alors c’est ma femme ou moi qui rentrons et donc désactivation alarme. 
sur la hc2 je faisais 3 vérifications en 15secondes afin d’être certain. 
je souhaite reproduire la même chose sur hc3, mais étant débutant sur celle ci, je suis perdu (sur plusieurs sujets)

Partager ce message


Lien à poster
Partager sur d’autres sites

Perso, je n'utiliserai pas ce QA pour armer et désarmer une alarme.
Moi je m'en sert pour activer le profil "Away" qui réduit le chauffage, lance l'aspirateur robot et active une alarme "silencieuse". Mais comme mon tél perd régulièrement le wifi, il m'arrive d'être en réunion en télétravail et que l'aspirateur se lance
Donc je ne me risque pas a armer une vraie alarme

Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Je dis:  «  sur déclenchement barrière multi faisceau, push notification sur 2 phones, afin de les réveiller pour qu’ils accrochent le wifi si ils sont dans la zone wifi, 

puis un push sur le Bp check du vd presence, qui a pour effet de pinger  sur ARP et voir si un des 2 phones apparaît,

si oui alors actions divers »

pour info, c’est hyper fiable, je l’utilise depuis 7 ans sur hc2.

le fait de l’utiliser ou non sur une alarme n’est pas la question ni le problème, je n’ai d’ailleurs pas précisé l’alarme ni même le contexte.

la question est: ou est passé le Bp check presence qu’il y avait sur le vd d’origine, qui lui permettait de fiabiliser les actions. 
j’espère avoir été un peu plus clair. Merci

 

large.3AA323A8-DA0A-4780-8C51-0D69087ADD6C.png.31bd89e2dc9245969a75ab7f9b789895.png

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah ok, je comprends mieux.
Le bouton était présent sur le VD mais je ne l'ai pas remis sur le QA. Il servait à lancer la vérification, a interval régulier.
Je peux le remettre si tu veux.

Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Oh oui volontiers :13:

ça serait cool

@Dragoniacs pourrais tu publier une le  V1.2 avec le BP check if phone is present ?

j'avais ceci dans le BP check sur HC2

fibaro:call(759, "sendDefinedPushNotification", "99");
fibaro:sleep(6*1000);
fibaro:log("Starting process");
 
local variable_globale_phone = "Phone_Alex";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule, 'IPAddress')
local _devicePort = fibaro:get(thismodule, 'TCPPort')
local _maxRetryProcess = 5;
local time = tonumber(os.time());
local maxtime = 14;

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 = "Boucle #".. retry .." depuis "..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 then
    fibaro:log("Appareil a été trouvé.");
    fibaro:setGlobal(variable_globale_phone,"Present") 
	
  else
    fibaro:log("Appareil non trouvé!");
    fibaro:setGlobal(variable_globale_phone,"Absent") 
  end
else
  fibaro:log("Error: " .. f);
end

et ceci dans la boucle principale

 

--[[
%%autostart
%%properties
%%globals
]]--

local thismodule = fibaro:getSelfId(); 
local status = fibaro:getGlobal("Phone_Alex")
if
	status == "Absent"
then 
	fibaro:call(thismodule, "setProperty", "currentIcon", 1075)
fibaro:setGlobal("PRESENCE","non")

end
if
	status == "Present"
then 
	fibaro:call(thismodule, "setProperty", "currentIcon", 1074)
  fibaro:setGlobal("PRESENCE","oui")
end

fibaro:sleep(1000);

pour info: dans le VD HC2, l'appui sur le BP check provoquait la recherche de l'ip fixe du phone sur le port 62078 

(vu la fiabilité, j'aimerai reproduire exactement la même chose sur HC3, merci)

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 25/02/2022 à 09:25, flamalex a dit :

Oh oui volontiers :13:

ça serait cool

@Dragoniacs pourrais tu publier une le  V1.2 avec le BP check if phone is present ?

j'avais ceci dans le BP check sur HC2


fibaro:call(759, "sendDefinedPushNotification", "99");
fibaro:sleep(6*1000);
fibaro:log("Starting process");
 
local variable_globale_phone = "Phone_Alex";
local thismodule=fibaro:getSelfId()
local _deviceIp = fibaro:get(thismodule, 'IPAddress')
local _devicePort = fibaro:get(thismodule, 'TCPPort')
local _maxRetryProcess = 5;
local time = tonumber(os.time());
local maxtime = 14;

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 = "Boucle #".. retry .." depuis "..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 then
    fibaro:log("Appareil a été trouvé.");
    fibaro:setGlobal(variable_globale_phone,"Present") 
	
  else
    fibaro:log("Appareil non trouvé!");
    fibaro:setGlobal(variable_globale_phone,"Absent") 
  end
else
  fibaro:log("Error: " .. f);
end

et ceci dans la boucle principale

 


--[[
%%autostart
%%properties
%%globals
]]--

local thismodule = fibaro:getSelfId(); 
local status = fibaro:getGlobal("Phone_Alex")
if
	status == "Absent"
then 
	fibaro:call(thismodule, "setProperty", "currentIcon", 1075)
fibaro:setGlobal("PRESENCE","non")

end
if
	status == "Present"
then 
	fibaro:call(thismodule, "setProperty", "currentIcon", 1074)
  fibaro:setGlobal("PRESENCE","oui")
end

fibaro:sleep(1000);

pour info: dans le VD HC2, l'appui sur le BP check provoquait la recherche de l'ip fixe du phone sur le port 62078 

(vu la fiabilité, j'aimerai reproduire exactement la même chose sur HC3, merci)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@Dragoniacs top merci 

observation(s): 

- je coupe le wifi sur le phone, je clic sur BP FIND, il lui faut 2 à 3 min pour me dire que je suis absent

- à l'inverse, je rétablis le wifi du phone, il me trouve de suite, sans que je clic sur le BP 

 

je souhaiterai que des le clic sur BP il trouve ou pas instantanément le phone

 

EDIT 1: 

j'ai supprimé le mainloop:

résultat,  je rétablis le wifi du phone, il me trouve de suite (3 sec), apres avoir clic sur le BP 

 

mais j'ai toujours un temps de retour élevé lorsque il faut me signaler l'absence

je coupe le wifi sur le phone, je clic sur BP FIND, il lui faut 1 min pour me dire que je suis absent

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, car il faut plusieurs boucles pour vérifier que le tel n'est pas joignable.
Il faut que tu modifies les paramètres si tu veux que ce soit plus rapide .

Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

@Dragoniacs  oui en réduisant ceci j'ai obtenu 1 minute

 

self.maxRetry_Process = 5  -- nombre max de ping de recherche
self.scheduler_value = 1  -- minutes entre 2 recherches de téléphone
self.check_wait = 5 -- secondes entre 2 ping

EDIT 1: 

j'ai supprimé le mainloop:

résultat,  je rétablis le wifi du phone, il me trouve de suite (3 sec), apres avoir clic sur le BP 

 

mais j'ai toujours un temps de retour élevé lorsque il faut me signaler l'absence

je coupe le wifi sur le phone, je clic sur BP FIND, il lui faut 1 min pour me dire que je suis absent

 

 

EDIT 2:

il y a ceci à modifier?

--check for error
   if self.foundUser == false then
        if retry < self.maxRetry_Process then
            fibaro.sleep(self.check_wait*1000);
            self:FindMac(retry + 1);

 

Modifié par flamalex

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, c'est ça qu'il faut changer.
Attention à ne pas surcharger ton réseau. Mais effectivement, si tu supprimes le mainloop pour ne garder que le lancement à la demande, cela ne devrait pas poser de problème.

Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

ok, peut on passer le scheduler en seconde? est ce que moi "0,2" minute fonctionne?

self.maxRetry_Process = 2  -- nombre max de ping de recherche
    self.scheduler_value = 0,2  -- minutes entre 2 recherches de téléphone
    self.check_wait = 5 -- secondes entre 2 ping

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Essaye

Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est surtout le check_wait qu'il faut que tu réduise je pense

Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

ok, j'obtiens 8 secondes pour l'absence, c'est good.

ce qui compte c'est la présence en moins de 3 sec, c'est top

il me reste à coller des variable "ABSENT" "PRESENT" dans le code pour les recup dans GEA ou pour les forcer

Partager ce message


Lien à poster
Partager sur d’autres sites

Il y a plus simple : le QA est un module de présence !
Il suffit de récupérer l'état de ce module : true ou false

Envoyé de mon M2012K11AG en utilisant Tapatalk

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

bonjour @Dragoniacs,

 

merci pour ce QA.

Cependant j'ai une petite question en rapport avec ton code, en effet j'essaye de comprendre pour progresser en m'inspirant de vos réalisations, et je ne comprends pas les lignes "tools:Message"

Cela fait il appel à un fichier non inclu dans le QA et si non comment obtenir ces messages intéressants?

 

par avance merci de tes lumières

Partager ce message


Lien à poster
Partager sur d’autres sites

Sur la HC3, tu as la possibilité de faire plusieurs fichiers de code dans un même QA.
Le code principal est dans le fichier "main".
Et j'ai un fichier "boîte à outil" qui est nommé "tools".
Tu y accède via une icône a gauche, quand tu modifies le QA.

Envoyé de mon M2012K11AG en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

merci @Dragoniacs pour ta réactivité, effectivement j'ai bien trouvé ton fichier tools. Du coup je comprends mieux. Cependant il y a une chose qui me chagrine c'est que ne vois pas les messages en question dans la fenetre de debug (si je remplace le code "tools:Message" par "print" ça fonctionne bien le code est bavard comme attendu). Qu'en penses-tu?

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans le débug il faut que tu affiches 2 choses : les lignes du QA_### et QA_nomduQA_###

Envoyé de mon M2012K11AG en utilisant Tapatalk

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

effectivement c'est parfait, merci bien, je ne connaissais pas cette subtilité.

Partager ce message


Lien à poster
Partager sur d’autres sites

×